VBやC#だと、System.IO.Directoryクラスで簡単にできてしまうことがC++では一苦労ということが多々あります。大昔に作ったソースコードを掘り当てて、同じことをする処理を備忘録。
フォルダー内のファイルを検索
例として、CFileFindクラスを使って、カレントパス(フォルダー)内の特定のファイルの一覧を検索する時のソースコードです。
詳しい内容はコメントを読んでください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //クラス作成 CFileFind ff; //現在のカレントパスをコピーするバッファ char tmpCurrentDir[MAX_PATH]; //現在のカレントパスをコピー GetCurrentDirectory( sizeof (tmpCurrentDir),tmpCurrentDir); //カレントパスを対象に移動させないとFindFile関数が動作しません SetCurrentDirectory(sTempPath); //フォルダ検索(ワイルドカードを使ってビットマップファイルを探しています) BOOL bFinding = ff.FindFile( "*.bmp" ); while (bFinding) { //次のファイル bFinding = ff.FindNextFile(); //ファイル名の取得 std::string fileName = ff.GetFileName(); } //カレントを戻す SetCurrentDirectory(tmpCurrentDir); |
CFileFindクラスは、カレントパスを対象に移動させないと検索することができないので、現在のパスを変数に一時保存して、処理後に元に戻すことをしています。
GDI時代のデバイスコンテキストのように、C++を使った開発は面倒な操作を繰り返していました。
C++を使ったフォルダー内検索などで困っている人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。
違います。例えば再帰検索を実装してみればわかります。
「CFileFindクラスは、カレントパスを対象に移動させないと検索することができない」
コメントありがとうございます。私の不勉強で申し訳ないのですが、記事のサンプルで例示しているコードで、SetCurrentDirectoryを使わずに、特定の場所のファイルを検索ができるということでしょうか?