プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

ファイル名の再帰検索

2007年09月13日 16時36分40秒 | ファイル関連

ファイルやフォルダ名を再帰検索するには次の関数群を使います。(戻る)

  1. 最初のファイルを検索(FindFirstFile)
  2. 続きのファイルを検索(FindNextFile)
  3. ファイル検索を閉じる(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 にはファイルやフォルダ名のフルパス名がセットされます。

関連記事



コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ファイル名の検索 | トップ | マウスカーソルの表示/非表示 »
最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
Unknown (H/N)
2014-12-26 15:01:40
findListSubdir( TEXT("C:") );
は、まずいです。
これでは文字列リテラルを書き換えようとして最悪GPFになってしまう。

TCHAR buf[_MAX_PATH];
_tcscpy(buf, TEXT("C:"));
findListSubdir(buf);
とかにしないといけない。
返信する
H/Nさんへ (ブログ管理人)
2014-12-29 21:17:49
> findListSubdir( TEXT("C:") );
> は、まずいです。
> これでは文字列リテラルを書き換えようとして最悪GPFになってしまう。
あっ。本当だ。ご指摘ありがとうございます。

> TCHAR buf[_MAX_PATH];
> _tcscpy(buf, TEXT("C:"));
> findListSubdir(buf);
> とかにしないといけない。
そうですね。
返信する

コメントを投稿

ファイル関連」カテゴリの最新記事