• 締切済み

あるディレクトリ内のファイルをファイル名でソートして取得

_FindFirst や FindFirstFile を使用すると指定フォルダの ファイル名を順番に取得できるのですが、ファイル名でソートされていません。 ファイル名でソートして取得する関数(API)はあるのでしょうか?

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

続き。 実行結果: 『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 個 -------------------- ほら。 ファイル名でソートされて表示されましたが…。 ソースを試して見て下さい。 もし上手くソートしない場合は、リスト構造の構造体に取得していき 自分でソートすれば良いだけですけど。 以上。

yamada009
質問者

お礼

再度ありがとうございます。 結局自分でメモリ内で貯めていきソートするしかないようですね。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★順番どおりに取得される?不思議。 >ファイル名でソートして取得する関数(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; } 続く。

yamada009
質問者

お礼

ありがとうございます。 基本的にソートされているのですが、極一部のファイル(ディレクトリ)がソートされないで取得されます。 それにMSDNにはソートして取得すると明言されていないので、ファイル名でソートされなくても仕様ということになりますし・・・ このため明示的にソートができないか悩んでいます。

回答No.1

 標準にはないと思います。  そもそも何を元にソートすればいいのかという問題もありますし。

yamada009
質問者

お礼

ありがとうございます。 なさそうですね。

関連するQ&A