ファイルやフォルダ名を再帰検索するには次の関数群を使います。(戻る)
- 最初のファイルを検索(FindFirstFile)
- 続きのファイルを検索(FindNextFile)
- ファイル検索を閉じる(FindClose)
プロトタイプ宣言
HANDLE FindFirstFile( LPCTSTR lpFileName, // ファイル名 LPWIN32_FIND_DATA lpFindFileData // データバッファ ); BOOL FindNextFile( HANDLE hFindFile, // 検索ハンドル LPWIN32_FIND_DATA lpFindFileData // データバッファ ); BOOL FindClose( HANDLE hFindFile // 検索ハンドル );
構造体
typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; // 属性 FILETIME ftCreationTime; // 作成日時 FILETIME ftLastAccessTime; // 最終アクセス日時 FILETIME ftLastWriteTime; // 最終更新日時 DWORD nFileSizeHigh; // サイズ(上位ワード) DWORD nFileSizeLow; // サイズ(下位ワード) DWORD dwReserved0; // 予約領域 DWORD dwReserved1; // 予約領域 TCHAR cFileName[ MAX_PATH ]; // ファイル名 TCHAR cAlternateFileName[ 14 ]; // 8.3形式のファイル名 } WIN32_FIND_DATA, *PWIN32_FIND_DATA;
サンプル
// カレント・ディレクトリの再帰検索 VOID findListSubdir( LPTSTR lpPath ) { WIN32_FIND_DATA fdFile; HANDLE hFind; LPTSTR lpWild; lpWild = PathAddBackslash( lpPath ); lstrcpy( lpWild, TEXT("*.*") ); if ( (hFind = FindFirstFile(lpPath,&fdFile)) != INVALID_HANDLE_VALUE ){ do { if ( fdFile.cFileName[0] != TEXT('.') ){ if ( fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){ lstrcpy( lpWild, fdFile.cFileName ); findListSubdir( lpPath ); // 再帰呼び出し /* fdFile.cFileNameにフォルダ名 lpPathにフォルダのフルパス名 */ } else{ lstrcpy( lpWild, fdFile.cFileName ); /* fdFile.cFileNameにファイル名 lpPathにファイルのフルパス名 */ } } } while ( FindNextFile(hFind,&fdFile) ); FindClose( hFind ); } lpWild[ -1 ] = '\0'; } // 呼び出し側 findListSubdir( TEXT("C:\\") );
- 構造体の fdFile.cFileName メンバにファイルやフォルダ名がセットされています。
- また lpPath にはファイルやフォルダ名のフルパス名がセットされます。
関連記事
- ファイル名の検索
- ファイル名の再帰検索
は、まずいです。
これでは文字列リテラルを書き換えようとして最悪GPFになってしまう。
TCHAR buf[_MAX_PATH];
_tcscpy(buf, TEXT("C:"));
findListSubdir(buf);
とかにしないといけない。
> は、まずいです。
> これでは文字列リテラルを書き換えようとして最悪GPFになってしまう。
あっ。本当だ。ご指摘ありがとうございます。
> TCHAR buf[_MAX_PATH];
> _tcscpy(buf, TEXT("C:"));
> findListSubdir(buf);
> とかにしないといけない。
そうですね。