
フォルダの中に含まれるファイルはFindFirstFile、FindNextFile、FindCloseで検索できる。ここでは指定したフォルダに含まれるファイルをCAtlArray
#include "atlstr.h"
#include "atlcoll.h"
//
// フォルダ内のファイル検索
//
//見つかったファイルをpastrFilesに追加する
//nRecursiveは子フォルダの探索数(デフォルトは探索しない)
//
bool GetFilesInFolder(LPCTSTR pszFolder,CAtlArray<CAtlString>* pastrFiles,int nRecursive=0)
{
BOOL bFind;
HANDLE hFind;
WIN32_FIND_DATA FindFileData;
CAtlString strFolder;
if(pszFolder == NULL || _tcslen(pszFolder) == 0 || pastrFiles == NULL)
return false;
//astrFiles.RemoveAll();
strFolder = pszFolder;
if(strFolder.Right(1) != _T('\\') && strFolder.Right(1) != _T('/'))
strFolder += _T("\\");
hFind = ::FindFirstFile(strFolder + _T("*.*"),&FindFileData);
if(hFind == INVALID_HANDLE_VALUE)
return false;
bFind = TRUE;
while(bFind)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//フォルダなら...
if(nRecursive > 0 && _tcsncmp(FindFileData.cFileName,_T("."),1) != 0 && _tcsncmp(FindFileData.cFileName,_T(".."),2) != 0 )
{
//再起で子フォルダ内を調べる
GetFilesInFolder(strFolder + FindFileData.cFileName,pastrFiles,nRecursive - 1);
}
}
else
{
//ファイルなら...
pastrFiles->Add(strFolder + FindFileData.cFileName);
}
bFind = ::FindNextFile(hFind,&FindFileData);
}
::FindClose(hFind);
return true;
}
void Test(void)
{
CAtlArray<CAtlString> astrFiles;
GetFilesInFolder(_T("c:\\"),&astrFiles);
size_t i;
size_t nSize;
CAtlString strMessage;
nSize = astrFiles.GetCount();
for(i = 0; i < nSize; i++)
{
strMessage += astrFiles[i];
strMessage += _T("\n");
}
::MessageBox(NULL,strMessage,_T(""),MB_OK);
}
