最近用到遍历文件目录,总结一下:
#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);
// ...
// ...
}
没有任何复杂的操作,只为备忘。