最近用到遍歷文件目錄,總結一下:
#include <Windows.h>
WIN32_FIND_DATA fndData;
HANDLE hFnd = INVALID_HANDLE_VALUE;
hFnd = ::FindFirstFile(_T("D:\\Program Files\\*.*"), &fndData);
if (hFnd == INVALID_HANDLE_VALUE)
{
return ;
}
while (::FindNextFile(&fndData))
{
CString strFileName = fndData.cFileName;
if (fndData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// 目錄
}
else
{
// 文件
}
}
if (::GetLastError() == 18)
{
// 目錄下的文件檢索完畢.
}
::FindClose(hFnd);
我們可以通過一個遞歸函數來遞歸遍歷:
void BuildRegSystem(
const tstring& strFileSystemPath,
const tstring& strAddParPath,
CSysMgr& mgr
)
{
tstring strFsPath = strFileSystemPath;
tstring strEnumPath = strFileSystemPath;
tstring strAddNewPath = strAddParPath;
if (*strFsPath.rbegin() != _T('\\'))
{
strFsPath += _T('\\');
}
if (*strAddNewPath.rbegin() != _T('\\'))
{
strAddNewPath += _T('\\');
}
strEnumPath = strFsPath + _T("*.*");
WIN32_FIND_DATA fndFile;
HANDLE hFnd = ::FindFirstFile(strEnumPath.c_str(), &fndFile);
if (hFnd == INVALID_HANDLE_VALUE)
{
return ;
}
while (::FindNextFile(hFnd, &fndFile))
{
tstring strFileName = fndFile.cFileName;
if (strFileName == _T(".."))
{
// 如果是上級目錄,則不管.
continue;
}
if (fndFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// 如果是文件夾,則進行遞歸.
mgr.CreateRegDirectory(strAddNewPath + strFileName);
BuildRegSystem(
strFsPath + strFileName,
strAddNewPath + strFileName,
regSystem
);
}
else
{
mgr.InsertEntry(strAddParPath, strFileName);
}
}
::FindClose(hFnd);
}
void Test()
{
CSysMgr mgr;
BuildRegSystem(_T("D:\\Program Files\\11game"), _T("\\"), mgr);
// ...
// ...
}
沒有任何複雜的操作,只爲備忘。