MFCでディレクトリ内の全てのファイルの取得する

/*-------------------------------------------------------------------------------/

  関数名:void FindAllFile(LPCTSTR pstrName, CListBox &listbox, BOOL bFolder)
  引 数:pstrName 検索するファイルの名前が入っている文字列へのポインタ。
      listbox  ファイル名を格納するCListBoxの参照。
     bFolder   TRUEにするとフォルダ名もリストに登録。
  解 説:ディレクトリ内のファイルを全て検索しリストボックスに登録。

/-------------------------------------------------------------------------------*/
void FindAllFile(LPCTSTR pstrName, CListBox &listbox, BOOL bFolder)
{
    CFileFind fnd;
    if(fnd.FindFile(pstrName, 0))
    {
        int i = 1;
        while(i)
        {
            i = fnd.FindNextFile();

            // 処理が長くなった時の為の対策。
            MSG msg;
            if(::PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
            {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);
            }

            // ファイル名が"."か".."の場合。
            if(fnd.IsDots())
                continue;
                        
            // フォルダだった場合。
            if(fnd.IsDirectory())
            {
                CString strFindFile = pstrName;
                strFindFile.Insert(strFindFile.ReverseFind('\\') + 1,
                                   fnd.GetFileName() + _T("\\"));

                // 再帰呼び出し。
                FindAllFile(strFindFile, listbox, bFolder);
                if(!bFolder)
                    continue;
            }
            // ファイル名の取得・設定
            CString strFilePath = pstrName;
            strFilePath = strFilePath.Left(strFilePath.ReverseFind('\\') + 1);
            listbox.AddString(strFilePath + fnd.GetFileName());
        }
        fnd.Close();
    }
}

使用例

// Cドライブのファイルとフォルダ全てをリストボックスに設定します。
char *findfile = _T("c:\*.*");
FindAllFile(findfile, m_listbox, TRUE);  // m_listboxはリストボックスのメンバ変数