- 締切済み
あるディレクトリ内のファイルをファイル名でソートして取得
_FindFirst や FindFirstFile を使用すると指定フォルダの ファイル名を順番に取得できるのですが、ファイル名でソートされていません。 ファイル名でソートして取得する関数(API)はあるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
続き。 実行結果: 『FindFirstFile.exe C:』として実行した。 -------------------- ◆C: ├1.ICO ├10.ICO ├11.ICO ├12.ICO ├<121ware> ├13.ICO ├14.ICO ├15.ICO ├16.ICO ├17.ICO ├18.ICO ├2.ICO ├3.ICO ├4.ICO ├5.ICO ├6.ICO ├7.ICO ├8.ICO ├9.ICO ├ACCESSP.DAT ├<Apache> ├<APSETUP> ├ASC_FONT.DAT ├AUTOEXEC.BAT ├<BACKUP> ├<BACKUP2> ├BASEINF.CFG ├BBS.MCR ├BEGIN.MCR ├BOOT.INI ├bootfont.bin ├BOX.MCR ├BROKE.ICO ├BUSINE.MCR ├BYE.ICO ├CCAT.BAT ├CLUB.MCR ├cmldr ├<Config.Msi> ├CONFIG.SYS ├COP.HLP ├COPER.BAT ├COPER.M01 ├COPER.M02 ├COPERE.EXE ├DB.MCR ├DEFAUL64.ICO ├DEFAULT.ICO ├<Desktop> ├DIAL.ICO ├Documents ├<Documents and Settings> ├<DOTNETFX> ├DSIGUP.MCR ├GATE.MCR ├GUIDE.MCR ├hiberfil.sys ├INFO1.ICO ├INFOS.MCR ├INFSALON.MCR ├INTERSIT.MCR ├INTRSITE.MCR ├IO.SYS ├JPDEC16.EXE ├JUMP.MCR ├<JUST> ├KANAGAWA.MCR ├KCOPER.M02 ├KGYOSEI.MCR ├KLOGIN.MCR ├LOGIN.MCR ├MAIL.MCR ├MAIL.MEN ├MAIN1.MCR ├MAINTERM.MCR ├MMAIN.MCR ├MOWARI.MCR ├MSDOS.SYS ├MYEDIT.BAT ├<MyGame> ├NAPDEV.SYS ├navaデータ ├navaデータ2 ├<Necread> ├NTDETECT.COM ├ntldr ├O.ICO ├OLG.MCR ├OLT.ICO ├OLT.MCR ├<OPTIONS> ├OSIRASE.MCR ├OWARI.MCR ├<OXPSP> ├<OXPSP1> ├<OXPSP2> ├pagefile.sys ├<PCP> ├PDOXUSRS.NET ├PRIVATE.CFG ├<Program Files> ├<PuCa.vol> ├QVAN.EXE ├RCVMAIL.MCR ├RCVMAIL0.MCR ├RCVMAIL1.MCR ├RCVMAIL2.MCR ├<RECYCLER> ├SAKUIN.CSV ├SAKUIN.MCR ├SALON.MCR ├SDELAY.DAT ├SETTEI.EXE ├SETUP.MCR ├SHOP.MCR ├SKENSAKU.MCR ├<Smdata> ├SNDMAIL.MCR ├SOKUHO.MCR ├<SUPPORT> ├<svrecord> ├<System Volume Information> ├<tanken> ├TITLE.ICO ├TITLE2.ICO ├TOKUSETU.MCR ├U.ICO ├Untitled.krm ├USER.MEN ├<VALUEADD> ├VCLS.COM ├VEXIT.COM ├VIEW.EXE ├VNAP.EXE ├VNAPDISP.EXE ├VOFF.COM ├VON.COM ├WELCOME.ICO ├WELTITLE.ICO ├WFDTREE.DAT ├<WINDOWS> ├<WINXP> ├<WUTemp> ├<yougo> ├受信.ICO ├接続.ICO ├未読一括.ICO ├未読表.ICO ├索引.ICO ├終了.ICO ├編集.ICO ├設定.ICO ├送信.ICO ├電掲.ICO ├ガイド1.ICO ├ガイド2.ICO ├ジャンプ.ICO ├ヨウコソ.ICO ├ライブラ.ICO フォルダ数:30 個 ファイル数:129 個 -------------------- ほら。 ファイル名でソートされて表示されましたが…。 ソースを試して見て下さい。 もし上手くソートしない場合は、リスト構造の構造体に取得していき 自分でソートすれば良いだけですけど。 以上。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★順番どおりに取得される?不思議。 >ファイル名でソートして取得する関数(API)はあるのでしょうか? ↑ ありません。 >_FindFirst や FindFirstFile を使用すると指定フォルダの ↑ この関数(_FindFirst)は処理系の独自関数ですよね。 Win32 API では FindFirstFile() と FindNextFile() がペアですし。 でも Win32 API で取得するとファイル名でソートされて取得されませんか? 私の環境(Windows XP)ではファイル名でソートされて取得されますが…。 下に確認用のソースを載せておきます。 サンプル関数: #include <stdio.h> #include <shlwapi.h> #include <windows.h> VOID FuncListSubdir( LPTSTR lpPath ) { // カウンタ変数 DWORD dwSubdir = 0; DWORD dwFiles = 0; // 宣言 WIN32_FIND_DATA fdFile; HANDLE hFind; LPTSTR lpWild; printf( "◆%s\n", lpPath ); lpWild = PathAddBackslash( lpPath ); lstrcpy( lpWild, TEXT("*.*") ); if ( (hFind = FindFirstFile(lpPath,&fdFile)) != INVALID_HANDLE_VALUE ){ do { if ( fdFile.cFileName[0] != '.' ){ if ( fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){ printf( "├<%s>\n", fdFile.cFileName ); dwSubdir++; } else{ printf( "├%s\n", fdFile.cFileName ); dwFiles++; } } } while ( FindNextFile(hFind,&fdFile) ); FindClose( hFind ); } lpWild[ -1 ] = '\0'; // 結果表示 printf( "\n" ); printf( "フォルダ数:%u 個\n", dwSubdir ); printf( "ファイル数:%u 個\n", dwFiles ); } // メイン関数 int main( int argc, char *argv[] ) { TCHAR szPath[ MAX_PATH ]; if ( argc == 1 ){ printf( "USAGE: FindFirstFile.exe <direct>\n" ); return 1; } // 検索 lstrcpy( szPath, argv[1] ); FuncListSubdir( szPath ); return 0; } 続く。
お礼
ありがとうございます。 基本的にソートされているのですが、極一部のファイル(ディレクトリ)がソートされないで取得されます。 それにMSDNにはソートして取得すると明言されていないので、ファイル名でソートされなくても仕様ということになりますし・・・ このため明示的にソートができないか悩んでいます。
- PROMETHEUS
- ベストアンサー率58% (31/53)
標準にはないと思います。 そもそも何を元にソートすればいいのかという問題もありますし。
お礼
ありがとうございます。 なさそうですね。
お礼
再度ありがとうございます。 結局自分でメモリ内で貯めていきソートするしかないようですね。