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

ファイルの検索はCFileFindクラスで使用すると簡単に出来ますが
サブディレクトリ内の検索は行いません。
サブディレクトリ内も検索したい場合は再帰呼び出しというものを行います。
再帰呼び出しとは関数内で自分の関数を呼び出し、ループさせる事です。

と言う事でファイルを検索する関数を作っちゃいましょう。
この関数はディレクトリ内の全てのファイルを検索してリストボックスに登録します。
途中、検索が長引いても固まらない様に対策をしています。


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

  関数名: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はリストボックスのメンバ変数

2001/5/8 追記
"C:\*.txt"等と指定しても.txtだけを取得することはできません。
それに対応させるには少し改造してみてください。

< 戻る << HOME ©1999-2001 by Akky, All right reserved.