「MFCの基礎 - ファイル」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
135行目: 135行目:
|}
|}
</center>
</center>
<br><br>
== ファイル / ディレクトリのコピー・移動・削除 ==
<syntaxhighlight lang="c++">
// ファイルのコピー
BOOL CopyFile(
                LPCTSTR    lpExistingFileName,  // コピー元のファイルのパス
                LPCTSTR    lpNewFileName,      // コピー先のファイルのパス
                BOOL        bFailIfExists        // 上書き許可 / 不許可
);
// ファイルの移動・ファイル名の変更
BOOL MoveFile(
                LPCTSTR    lpExistingFileName,  // 移動元のファイルのパス
                LPCTSTR    lpNewFileName        // 移動後のファイルのパス
);
// ファイルの削除
BOOL DeleteFile(
                  LPCTSTR    lpFileName  // 削除するファイルのパス
);
</syntaxhighlight>
<br><br>
== ファイル / ディレクトリの属性の取得・設定 ==
<syntaxhighlight lang="c++">
// ファイルおよびディレクトリの属性の取得
DWORD GetFileAttributes(
                          LPCTSTR  lpFileName  // ファイルのパス
);
// ファイルおよびディレクトリの属性の設定
BOOL SetFileAttributes(
                          LPCTSTR  lpFileName,  // ファイルのパス
                          DWORD    dwAttributes  // 属性フラグ
);
</syntaxhighlight>
<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ 属性の定数
|-
! style="background-color:#66CCFF;" | 定数
! style="background-color:#66CCFF;" | 意味
|-
| FILE_ATTRIBUTE_NORMAL || 特に属性なし
|-
| FILE_ATTRIBUTE_ARCHIVE || アーカイブ属性
|-
| FILE_ATTRIBUTE_READONLY || 読み取り専用の属性
|-
| FILE_ATTRIBUTE_HIDDEN || 隠しファイルの属性
|-
| FILE_ATTRIBUTE_SYSTEM || システムファイルの属性
|-
| FILE_ATTRIBUTE_DIRECTORY || ディレクトリの属性
|}
</center>
<br>
<code>FILE_ATTRIBUTE_NORMAL</code>属性は、他の属性定数と組み合わせて使用できない。<br>
<code>FILE_ATTRIBUTE_DIRECTORY</code>属性は、属性を指定しても設定できない。<br>
<br><br>
== ファイルのタイプの取得 ==
<syntaxhighlight lang="c++">
DWORD GetFileType(
                    HANDLE  hFile  // ファイルのハンドル
);
</syntaxhighlight>
<br>
以下の例では、変数hFileにファイルのハンドルを指定する。<br>
<code>GetFileType</code>関数を使用して、コンソールの標準入出力等でリダイレクションされたかどうかを確認することができる。<br>
<syntaxhighlight lang="c++">
// ファイルのタイプの判定
switch(GetFileType(hFile))
{
    CASE FILE_TYPE_UNKNOWN:
      printf(TEXT("ファイルのタイプは不明\n"));
      break;
    CASE FILE_TYPE_DISK:
      printf(TEXT("ファイルのタイプはディスク上のファイル\n"));
      break;
    CASE FILE_TYPE_CHAR:
      printf(TEXT("ファイルのタイプはデバイスまたはコンソール\n"));
      break;
    CASE FILE_TYPE_PIPE:
      printf(TEXT("ファイルのタイプは名前付きまたは名前なしパイプ\n"));
      break;
    DEFAULT:
      printf(TEXT("GetFileType関数の致命的なエラー\n"));
      break;
}
</syntaxhighlight>
<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ 戻り値の定数
|-
! style="background-color:#66CCFF;" | 定数
! style="background-color:#66CCFF;" | 意味
|-
| FILE_TYPE_UNKNOWN || ファイルのタイプは不明
|-
| FILE_TYPE_DISK || ファイルのタイプはディスク上のファイル
|-
| FILE_TYPE_CHAR || ファイルのタイプはデバイスまたはコンソール
|-
| FILE_TYPE_PIPE || ファイルのタイプは、名前付きパイプまたは名前なしパイプ
|}
</center>
<br><br>
== ファイルサイズの取得 ==
==== GetFileSize関数 ====
<syntaxhighlight lang="c++">
DWORD GetFileSize(
                    HANDLE    hFile,          // ファイルのハンドル
                    LPDWORD  lpFileSizeHigh  // ファイルサイズの上位ワード
);
</syntaxhighlight>
<br>
以下の例では、変数hFileにファイルのハンドルを指定して、<br>
4[GB]以下のファイルの場合、GetFileSize関数の戻り値をそのまま受け取り、4[GB]以上のファイルの場合、上位ワードのポインタを第2引数に渡している。<br>
その後、64ビット整数の変数等に代入して使用する。<br>
<syntaxhighlight lang="c++">
// 4[GB]以下のファイルサイズの取得
DWORD dwSize = GetFileSize(hFile, NULL);
// 4[GB]以上のファイルサイズの取得
DWORDLONG  dllSize = 0;  // 64ビット整数
DWORD      dwSize  = 0;  // 下位ワード
DWORD      dwHigh  = 0;  // 上位ワード
dwSize  = GetFileSize(hFile, &dwHigh);
dllSize = (((DWORDLONG)dwHigh << 32) | dwSize);
</syntaxhighlight>
<br>
==== GetFileSizeEx関数 ====
4[GB]以上のファイルサイズを取得する場合、<code>GetFileSizeEx</code>関数も使用できる。<br>
<syntaxhighlight lang="c++">
BOOL GetFileSizeEx(
                      HANDLE            hFile,      // ファイルのハンドル
                      LPLARGE_INTEGER  lpFileSize  // ファイルサイズの構造体
);
</syntaxhighlight>
<br>
LARGE_INTEGER構造体を、以下に示す。<br>
<syntaxhighlight lang="c++">
typedef union _LARGE_INTEGER {
    struct {
        DWORD  LowPart;        // 下位32ビット
        LONG    HighPart;      // 上位32ビット
    };
    struct {
        DWORD  LowPart;        // 下位32ビット
        LONG    HighPart;      // 上位32ビット
    } u;
    LONGLONG    QuadPart;      // 64ビット整数
} LARGE_INTEGER, *LPLARGE_INTEGER;
</syntaxhighlight>
<br>
以下の例では、変数hFileにファイルのハンドルを指定して、ファイルサイズを64ビット整数で表示している。<br>
また、<code>printf</code>関数がC99規格に準じている場合は、<code>%lld</code>を指定することで64ビット整数を表示できる。<br>
<syntaxhighlight lang="c++">
LARGE_INTEGER i64Size = 0;
GetFileSizeEx(hFile, &i64Size);
printf(TEXT("ファイルサイズ : %I64ld\n"), i64Size.QuadPart);
// または
// printf(TEXT("ファイルサイズ : %lld\n"), i64Size.QuadPart);
</syntaxhighlight>
<br><br>
== ファイルが実行可能かどうか確認する ==
<syntaxhighlight lang="c++">
BOOL GetBinaryType(
                      LPCTSTR  lpApplicationName,  // ファイルのパス
                      LPDWORD  lpBinaryType        // バイナリタイプ情報
);
</syntaxhighlight>
<br>
以下の例では、<code>GetBinaryType</code>関数を使用して、ファイルが実行可能かどうかを確認している。<br>
バッチファイル(*.bat)やDLLファイルは実行可能とは判定しない。<br>
<syntaxhighlight lang="c++">
DWORD dwType = 0;
GetBinaryType(TEXT("C:\\Windows\\System32\\calc.exe"), &dwType);
switch(dwType)
{
    case SCS_32BIT_BINARY:
      printf(TEXT("Win32ベースのアプリケーション\n"));
      break;
    case SCS_DOS_BINARY:
      printf(TEXT("MS-DOSベースのアプリケーション\n"));
      break;
    case SCS_OS216_BINARY:
      printf(TEXT("16ビット版OS/2ベースのアプリケーション\n"));
      break;
    case SCS_PIF_BINARY:
      printf(TEXT("MS-DOSベースのアプリケーションを実行するPIFファイル\n"));
      break;
    case SCS_POSIX_BINARY:
      printf(TEXT("POSIXベースのアプリケーション\n"));
      break;
    case SCS_WOW_BINARY:
      printf(TEXT("16ビット版Windowsベースのアプリケーション\n"));
      break;
    default:
      printf(TEXT("GetFileType関数の致命的なエラー\n"));
      break;
}
</syntaxhighlight>
<br><br>
== ファイル / ディレクトリの検索 ==
<syntaxhighlight lang="c++">
// 最初のファイルを検索
HANDLE FindFirstFile(
                        LPCTSTR            lpFileName,    // ファイルのパス
                        LPWIN32_FIND_DATA  lpFindFileData  // データバッファ
);
// 次のファイルを検索
BOOL FindNextFile(
                    HANDLE              hFindFile,      // 検索ハンドル
                    LPWIN32_FIND_DATA  lpFindFileData  // データバッファ
);
// ファイル検索を終了する
BOOL FindClose(
                  HANDLE  hFindFile  // 検索ハンドル
);
</syntaxhighlight>
<br>
LPWIN32_FIND_DATA構造体を以下に示す。<br>
<syntaxhighlight lang="c++">
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;
</syntaxhighlight>
<br>
以下の例では、<code>WIN32_FIND_DATA</code>構造体の<code>cFileName</code>メンバ変数に、ファイルやディレクトリのパスが代入されている。<br>
<syntaxhighlight lang="c++">
// カレントディレクトリのファイル検索
void findDirectory()
{
    WIN32_FIND_DATA fdFile = {0};
    HANDLE          hFind;
    if((hFind = FindFirstFile(TEXT("*.*"),&fdFile)) != INVALID_HANDLE_VALUE)
    {
      do
      {
          if(fdFile.cFileName[0] != TEXT('.') || fdFile.cFileName[0] != TEXT('..'))
          {
            if(fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {  // fdFile.cFileNameにディレクトリ名
            }
            else
            {  // fdFile.cFileNameにファイル名
            }
          }
      }while(FindNextFile(hFind, &fdFile));
      FindClose(hFind);
    }
}
</syntaxhighlight>
<br><br>
<br><br>



2021年7月18日 (日) 15:19時点における版

ファイルを開く

CFileクラスのOpenメソッドは、第1引数はファイル名、第2引数はファイルモードを指定する。

 CFile File;
 if(File.Open(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary))
 {
    // To do something
 }
 
 file.Close();


主なモードを以下に記載する。

モード名 説明
CFile::modeCreate ファイルを新規に作成する。
既にファイルがある場合は、削除して新規に作成する。
CFile::modeNoTruncate modeCreateと組み合わせて使用する場合、
既にファイルがある場合は新規作成せずに開く。
CFile::modeRead ファイルを読み取り専用で開く。
CFile::modeReadWrite ファイルを読み書き可能で開く。
CFile::modeWrite ファイルを書き込み専用で開く。
CFile::shareDenyNone 他プロセスからも読み書きできる状態でファイルを開く。
CFile::shareExclusive ファイルを排他モードで開く。
CFile::typeText テキストモードを設定する。
派生クラスで使用する。
CFile::typeBinary バイナリモードを設定する。
派生クラスで使用する。



1行ずつ読み込む

 CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeRead | CFile::typeText);
 CString strReadLine = _T("");
 while(File.ReadString(strReadLine))
 {
    TRACE(strReadLine + _T("\n"));
 }



ファイルに書き込む

 CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText);
 CString strWriteLine1 = _T("hoge\n");
 File.WriteString(strWriteLine1);
 
 CString strWriteLine2 = _T("piyo\n");
 File.WriteString(strWriteLine2);
 
 File.Close();



ファイルに追記する

CFileおよびCStdioFileには追記モードが存在しないので、ファイルを開いた後、書き込み位置を指定する必要がある。 下記のサンプルコードでは、ファイルを書き込みモードで開いた後、SeekToEndメソッドで書き込み位置を最後尾に移動する。

 CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText);
 File.SeekToEnd();        // 書き込み位置を最後尾に移動
 
 CString strWriteLine1 = _T("hoge\n");
 File.WriteString(strWriteLine1);  // Write a line
 
 CString strWriteLine2 = _T("piyo\n");
 File.WriteString(strWriteLine2);  // Write a line
 
 File.Close();



ファイルを削除する

 // 単一のファイルを削除する
 CFile::Remove(_T("C:\\test.txt"));  // Cドライブ直下のtest.txtファイルを削除する


 // 複数のファイルやディレクトリを削除する
 CString strRemoveDirPath = _T("C:\\test?");
 strRemoveDirPath.SetAt(strRemoveDirPath.GetLength() - 1, 0);
 
 SHFILEOPSTRUCT drive = {};
 drive.hwnd   = this->m_hWnd;      // ウィンドウハンドル
 drive.wFunc  = FO_DELETE;         // 実行する操作
 drive.pFrom  = strRemoveDirPath;  // 対象ファイル名
 drive.pTo    = NULL;              // 目的ファイル名
 drive.fFlags =  FOF_ALLOWUNDO;    // フラグ
 
 SHFileOperation(&drive);

wFuncは、下記に示す通り、実行する操作を指定する。

命令マクロ 説明
FO_MOVE pFromをpToの位置に移動
FO_COPY pFromをpToの位置にコピー
FO_DELETE Fromを削除
FO_RENAME pFromをpToに変更

pFromにはディレクトリおよびファイルを指定する。ワイルドカードも使用できる。
また、NULL文字(\0)で区切ると複数指定できる。

fFlagは、下記に示す通り、動作時のフラグを指定する。

命令マクロ 説明
FOF_SILENT 経過を表すダイアログボックス非表示
FOF_ALLOWUNDO 削除の場合はゴミ箱に移動
FOF_NOERRORUI エラーが発生した場合はUI非表示
FOF_NOCONFIRMATION 表示されるダイアログボックスで『はい』または『すべて』を選択する



ファイル / ディレクトリのコピー・移動・削除

 // ファイルのコピー
 BOOL CopyFile(
                 LPCTSTR     lpExistingFileName,  // コピー元のファイルのパス
                 LPCTSTR     lpNewFileName,       // コピー先のファイルのパス
                 BOOL        bFailIfExists        // 上書き許可 / 不許可
 );
 
 // ファイルの移動・ファイル名の変更
 BOOL MoveFile(
                 LPCTSTR     lpExistingFileName,  // 移動元のファイルのパス
                 LPCTSTR     lpNewFileName        // 移動後のファイルのパス
 );
 
 // ファイルの削除
 BOOL DeleteFile(
                   LPCTSTR     lpFileName  // 削除するファイルのパス
 );



ファイル / ディレクトリの属性の取得・設定

 // ファイルおよびディレクトリの属性の取得
 DWORD GetFileAttributes(
                           LPCTSTR   lpFileName  // ファイルのパス
 );
 
 // ファイルおよびディレクトリの属性の設定
 BOOL SetFileAttributes(
                          LPCTSTR   lpFileName,   // ファイルのパス
                          DWORD     dwAttributes  // 属性フラグ
 );


属性の定数
定数 意味
FILE_ATTRIBUTE_NORMAL 特に属性なし
FILE_ATTRIBUTE_ARCHIVE アーカイブ属性
FILE_ATTRIBUTE_READONLY 読み取り専用の属性
FILE_ATTRIBUTE_HIDDEN 隠しファイルの属性
FILE_ATTRIBUTE_SYSTEM システムファイルの属性
FILE_ATTRIBUTE_DIRECTORY ディレクトリの属性


FILE_ATTRIBUTE_NORMAL属性は、他の属性定数と組み合わせて使用できない。
FILE_ATTRIBUTE_DIRECTORY属性は、属性を指定しても設定できない。


ファイルのタイプの取得

 DWORD GetFileType(
                     HANDLE  hFile  // ファイルのハンドル
 );


以下の例では、変数hFileにファイルのハンドルを指定する。
GetFileType関数を使用して、コンソールの標準入出力等でリダイレクションされたかどうかを確認することができる。

 // ファイルのタイプの判定
 switch(GetFileType(hFile))
 {
    CASE FILE_TYPE_UNKNOWN:
       printf(TEXT("ファイルのタイプは不明\n"));
       break;
    CASE FILE_TYPE_DISK:
       printf(TEXT("ファイルのタイプはディスク上のファイル\n"));
       break;
    CASE FILE_TYPE_CHAR:
       printf(TEXT("ファイルのタイプはデバイスまたはコンソール\n"));
       break;
    CASE FILE_TYPE_PIPE:
       printf(TEXT("ファイルのタイプは名前付きまたは名前なしパイプ\n"));
       break;
    DEFAULT:
       printf(TEXT("GetFileType関数の致命的なエラー\n"));
       break;
 }


戻り値の定数
定数 意味
FILE_TYPE_UNKNOWN ファイルのタイプは不明
FILE_TYPE_DISK ファイルのタイプはディスク上のファイル
FILE_TYPE_CHAR ファイルのタイプはデバイスまたはコンソール
FILE_TYPE_PIPE ファイルのタイプは、名前付きパイプまたは名前なしパイプ



ファイルサイズの取得

GetFileSize関数

 DWORD GetFileSize(
                     HANDLE    hFile,          // ファイルのハンドル
                     LPDWORD   lpFileSizeHigh  // ファイルサイズの上位ワード
 );


以下の例では、変数hFileにファイルのハンドルを指定して、
4[GB]以下のファイルの場合、GetFileSize関数の戻り値をそのまま受け取り、4[GB]以上のファイルの場合、上位ワードのポインタを第2引数に渡している。
その後、64ビット整数の変数等に代入して使用する。

 // 4[GB]以下のファイルサイズの取得
 DWORD dwSize = GetFileSize(hFile, NULL);
 
 // 4[GB]以上のファイルサイズの取得
 DWORDLONG   dllSize = 0;  // 64ビット整数
 DWORD       dwSize  = 0;  // 下位ワード
 DWORD       dwHigh  = 0;  // 上位ワード
 
 dwSize  = GetFileSize(hFile, &dwHigh);
 dllSize = (((DWORDLONG)dwHigh << 32) | dwSize);


GetFileSizeEx関数

4[GB]以上のファイルサイズを取得する場合、GetFileSizeEx関数も使用できる。

 BOOL GetFileSizeEx(
                      HANDLE            hFile,      // ファイルのハンドル
                      LPLARGE_INTEGER   lpFileSize  // ファイルサイズの構造体
 );


LARGE_INTEGER構造体を、以下に示す。

 typedef union _LARGE_INTEGER {
    struct {
        DWORD   LowPart;        // 下位32ビット
        LONG    HighPart;       // 上位32ビット
    };
 
    struct {
        DWORD   LowPart;        // 下位32ビット
        LONG    HighPart;       // 上位32ビット
    } u;
 
    LONGLONG    QuadPart;       // 64ビット整数
 } LARGE_INTEGER, *LPLARGE_INTEGER;


以下の例では、変数hFileにファイルのハンドルを指定して、ファイルサイズを64ビット整数で表示している。
また、printf関数がC99規格に準じている場合は、%lldを指定することで64ビット整数を表示できる。

 LARGE_INTEGER i64Size = 0;
 
 GetFileSizeEx(hFile, &i64Size);
 printf(TEXT("ファイルサイズ : %I64ld\n"), i64Size.QuadPart);
 // または
 // printf(TEXT("ファイルサイズ : %lld\n"), i64Size.QuadPart);



ファイルが実行可能かどうか確認する

 BOOL GetBinaryType(
                      LPCTSTR   lpApplicationName,  // ファイルのパス
                      LPDWORD   lpBinaryType        // バイナリタイプ情報
 );


以下の例では、GetBinaryType関数を使用して、ファイルが実行可能かどうかを確認している。
バッチファイル(*.bat)やDLLファイルは実行可能とは判定しない。

 DWORD dwType = 0;
 
 GetBinaryType(TEXT("C:\\Windows\\System32\\calc.exe"), &dwType);
 
 switch(dwType)
 {
    case SCS_32BIT_BINARY:
       printf(TEXT("Win32ベースのアプリケーション\n"));
       break;
    case SCS_DOS_BINARY:
       printf(TEXT("MS-DOSベースのアプリケーション\n"));
       break;
    case SCS_OS216_BINARY:
       printf(TEXT("16ビット版OS/2ベースのアプリケーション\n"));
       break;
    case SCS_PIF_BINARY:
       printf(TEXT("MS-DOSベースのアプリケーションを実行するPIFファイル\n"));
       break;
    case SCS_POSIX_BINARY:
       printf(TEXT("POSIXベースのアプリケーション\n"));
       break;
    case SCS_WOW_BINARY:
       printf(TEXT("16ビット版Windowsベースのアプリケーション\n"));
       break;
    default:
       printf(TEXT("GetFileType関数の致命的なエラー\n"));
       break;
 }



ファイル / ディレクトリの検索

 // 最初のファイルを検索
 HANDLE FindFirstFile(
                        LPCTSTR             lpFileName,     // ファイルのパス
                        LPWIN32_FIND_DATA   lpFindFileData  // データバッファ
 );
 
 // 次のファイルを検索
 BOOL FindNextFile(
                     HANDLE              hFindFile,      // 検索ハンドル
                     LPWIN32_FIND_DATA   lpFindFileData  // データバッファ
 );
 
 // ファイル検索を終了する
 BOOL FindClose(
                  HANDLE   hFindFile  // 検索ハンドル
 );


LPWIN32_FIND_DATA構造体を以下に示す。

 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;


以下の例では、WIN32_FIND_DATA構造体のcFileNameメンバ変数に、ファイルやディレクトリのパスが代入されている。

 // カレントディレクトリのファイル検索
 void findDirectory()
 {
    WIN32_FIND_DATA fdFile = {0};
    HANDLE          hFind;
 
    if((hFind = FindFirstFile(TEXT("*.*"),&fdFile)) != INVALID_HANDLE_VALUE)
    {
       do
       {
          if(fdFile.cFileName[0] != TEXT('.') || fdFile.cFileName[0] != TEXT('..'))
          {
             if(fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
             {  // fdFile.cFileNameにディレクトリ名
 
             }
             else
             {  // fdFile.cFileNameにファイル名
 
             }
          }
       }while(FindNextFile(hFind, &fdFile));
 
       FindClose(hFind);
    }
 }



ファイルの再帰検索

以下の例では、指定したディレクトリに存在する全てのファイルを再帰検索している。

 // 関数内で自分自身を呼び出す再帰関数を作る
 void CSampleView::SerchFiles(CString Path)
 {
    // ファイルの検索
    CFileFind Finder;
    Path += _T("\\*.*");
    BOOL bWorking = Finder.FindFile(Path, 0);
 
    while(bWorking)
    {
       bWorking	= Finder.FindNextFile();
       CString Getpath = Finder.GetFilePath();
       CString Getname = Finder.GetFileName();
 
       // 再帰的にディレクトリアイテムを作成
       if(!(GetFileAttributes(Getpath) & FILE_ATTRIBUTE_DIRECTORY))
       {  // ファイルの場合
       }
       else
       {
          if(Getname != _T(".") && Getname != _T(".."))
          {  // ディレクトリの場合
             SerchFiles(Getpath);
          }
       }
    }
 }


例えば、以下のようにSerchFilesメソッドを呼べば、次のようにDドライブの内容を全て書き出す。

 SerchFiles(_T("D:\\"))