• 締切済み

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

_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

  • ファイル名の取得

    CreateFileの第一引数の pszFileName というのは、createfileで開いたファイル名ですよね? それをcharの配列にコピーして表示させようとしているのですが、 うまく表示されません。 (うまく表示されるときとされないときがあります。 wordを立ち上げた時のdatファイルなどは表示される) 日本語が入っていると表示されないのかと思いましたがそうでもないようです…。 開いたファイル名を取得するAPIがあるのかと思い、探してみましたが 見つかりません…。 getFileSize APIを使用することで、ファイルサイズを取得出来るのはわかったのですが、ファイル名を取得するにはどのAPIを使用すればよいのかが調べてもわかりません。 どなたかご存知のお方いられましたら、ご教授願います。 よろしくおねがいします。

  • delphi5でのディレクトリ内ファイル名の取得

    こんにちは。質問があります。 delphiのアプリケーションであるディレクトリのフォルダ内のファイルを 別のディレクトリのフォルダ内に名前を変えてコピーしようと考えています。 基本的にコピー元のディレクトリ名はわかりません。 コピー先のディレクトリは存在しなければ、名前を指定して作成し、その中に名前を変更したファイルを格納する流れです (わかりづらいかも・・・) フォルダが存在しなければ作成したり、ファイル名を変更してコピーする のはわかったのですが、コピー元のディレクトリ内のファイル(もしくはディレクトリ)名を取得することがわかりません。 全てソースの中でプログラムしたいと考えています。(VCLは使用しない) こんなんでもわかっちゃったりする方がいらっしゃいましたら、 どうか愛の手を・・・

  • フォルダ内のサブフォルダ名やファイル名の取得

    VB初心者です。 あるフォルダ内のサブフォルダ名や数、ファイル名を取得したいのですが・・・ コントロールのDirListBoxを使用するか、Dir関数を使用したいのですが、上手くできません。 ご存知の方、教えてください

  • Excel VBAでのファイル名取得方法

    複数のファイルを結合するマクロを組んでいる中で、同一フォルダ内に有るファイルをDIR関数を使って名前を取得しています。DIR関数でファイル名を取得したときのファイルの順番がHDDの書き込み順番で有ることが分かりました。 過去の質問も捜してみましたが、上手く見つけることが出来ませんでした。 ファイルの作成日、もしくは、ファイル名称で順番に取得する手法はないでしょうか?Excelのシートに記載しないでマクロを動作させたいと考えております。 使用しているExcelは2003です。 皆様のお知恵を貸してください。よろしくお願いします。

  • フォルダ内にあるファイル名を取得したい

    cを利用して、指定したフォルダの中にある全てのファイルの名前を取得するプログラムを作りたいのですが、適した関数がわかりません。 指定するフォルダはあらかじめ決めうちで、その中には.txtのファイルのみを格納します。 どなたか教えてください。できれば自分で作りたいのでヒントをください。お願いします。 VisualC++.netを使っています。OSはXPです。

  • FTPサーバーから受信したファイル一覧からファイル名だけを取得したいです

    こんばんは。いつもお世話になっております。 VB.NET+WinXPなのですが、 FTPサーバーにログインして、 LISTコマンドでファイル一覧を要求すると 「drwxrwxr-x 2 53 53 4096 Feb 28 2006 abc」 などというファイルやフォルダの一覧がかえって来ると思うのですが、 この中からファイル名やフォルダ名だけを取得するには どうしたらよいでしょうか。 TABやコンマが入っていないので、文字列関数で切り取るにも 区切りがわからないと思うのです。 ローカルドライブのDir関数なら、FileAttribute.Nomalや.Directoryの指定でファイル名だけや ディレクトリー名だけを指定して 取得することが出来るのですが、FTPサーバーの場合からの場合はどういった方法があるでしょうか。 参考程度でも構いませんので教えて頂けるとたすかります。m(__)m

  • ファイル名の取得(エクセルVBA)

     エクセル97を使用しています。 過去ログを見て、ファイル名の取得にDir関数が使えることは、判ったのですが、不特定数のファイル名に対応する方法が思いつきません。  特定のフォルダ内の、数が可変するファイルのファイル名を、検索した時点で、全部セル(または変数でも可)上に取得する方法って、ありますでしょうか?  よろしくお願いします。

  • ディレクトリ以下のファイル名を取得する

    ディレクトリ名を指定するだけで、 そのディレクトリ内にある全てのデータファイルを 読み込んで処理するプログラムをC++で作ろうと考えています。 その為に、ディレクトリ以下のファイルのファイル名を 取得する方法(命令)を教えて頂きたく思います。 よろしくお願いします。

  • ファイル作成者名の取得

    VBで、ファイルの作成者名・更新者名・作成日時・更新日時を取得する方法を探しています。 作成日時・更新日時の方はAPIを使用すれば可能だと分かったのですが、 作成者名・更新者名の取得方法が見つかりません。 取得が可能かどうかも含めて、教えていただけませんでしょうか? よろしくお願いします。

  • C言語でファイル名を取得

    C言語でフォルダ内のファイル名を取得する方法ってありますか? そういう関数とかありませんか? 教えてほしいのですが。

専門家に質問してみよう