掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
FindFirstFileでのサブディレクトリ内全てを検索するには? (ID:58972)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
お世話になっております。DD.でございます。 少々長くなってしまいました。申し訳ございません。 只今、FindFirstFileを使用して、指定フォルダ以下の サブフォルダを含めたファイルの検索を行っております。 FindFirstFileの第1引数に"フォルダ名+*(c:\*)"のように指定すると 第2引数である WIN32_FIND_DATA 構造体の cFileName メンバに 検索フォルダ内にある、条件に一致される最初のフォルダ及びファイルが 検索されます。 ただ、第1引数を"フォルダ名(c:\)"とした場合、第2引数である WIN32_FIND_DATA 構造体の cFileName メンバに カレントディレクトリ(=プロジェクト名)が入ってしまいます。 #カレントディレクトリ(=プロジェクト名)とさせて頂いたのは #カレントディレクトリとプロジェクト名が同じなので #どちらから取られているのかわからないためです。 カレントディレクトリへのパスが入るならばまだしも カレントディレクトリ名が入ってしまうので、 「カレントディレクトリ = c:\aaa\bbb\カレント」 であったとしても FindFirstFile 的には 「c:\カレント」に、なってしまい、当然フォルダ及びファイルは見つからないとなってしまいます。 MSDNより、第1引数に 「"有効なディレクトリ名"、またはパス名とファイル名を保持している、NULL で終わる文字列へのポインタを指定します。」 とあるので、ファイルパスではなく、フォルダパスを引数に与えただけなのですが、これではいけないのでしょうか? 以下、その部分のソースを抜粋致します。 //sFindPath = 指定ファイル名, sFindDir = 指定フォルダ, sFindFile = "*" sprintf( sFindPath, "%s\\%s", sFindDir, sFindFile ); WIN32_FIND_DATAA find_file; // ここでWIN32_FIND_DATA::cFileName = カレントディレクトリになります HANDLE hFind = FindFirstFileA( sFindDir, &find_file ); if ( hFind != INVALID_HANDLE_VALUE ) { do { if ( strcmp( find_file.cFileName, "." ) && strcmp( find_file.cFileName, ".." ) ) { if ( find_file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { // フォルダ時 char sFindSubDir[_MAX_PATH]; sprintf( sFindSubDir, "%s\\%s", FindDir,find_file.cFileName ); // サブディレクトリ内検索 // filelist関数は"この"関数です。再帰になっています。 file_cnt += filelist( sFindSubDir, sFindFile ); } else { // ファイル時 // ここで検索ファイルと一致するかどうかを調べてる...つもり if ( FindFirstFileA( sFindPath, &find_file ) !=INVALID_HANDLE_VALUE ) { sprintf( sGetFilePath, "%s\\%s", sFindDir, find_file.cFileName ); // vector に検索されたファイル名を格納しています vs.push_back( sGetFilePath ); ++file_cnt; } } } } while ( FindNextFileA( hFind, &find_file ) ); FindClose( hFind ); } 以上のソースで FindFirstFile の仕様及び認識の間違いによるご指摘、 プログラム的なつっこみも感激です。 よろしくお願い致します。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.