我想列出驱动器C中的所有文件并编写以下函数:
void Class_fileHandler::FindAllFiles(wstring FolderName)
{
WIN32_FIND_DATA findData;
wstring searchFolderName(FolderName);
searchFolderName.append(TEXT("\\*.*"));
HANDLE FirstFile = FindFirstFile(&searchFolderName[0], &findData);
while (FindNextFile(FirstFile, &findData))
{
// Thanks to Collin Dauphinee
if (((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) /**&& (findData.dwFileAttributes != FILE_ATTRIBUTE_SYSTEM)**/)
{
m_fileQueuer.push_back(findData.cFileName);
}
else if (wcscmp(findData.cFileName, TEXT(".")) && wcscmp(findData.cFileName, TEXT("..")))
{
wstring NewPath = FolderName + TEXT("\\") + findData.cFileName;
FindAllFiles(NewPath);
}
}
}
void Class_fileHandler::testfunc()
{
WIN32_FIND_DATA findData;
for (int i = 0; i < m_driveLetters.size(); ++i)
{
// At the moment there is only C:
// So the function call is:
// FindAllFiles(TEXT("C:"))
FindAllFiles(m_driveLetters[i]);
}
wofstream file("C:\\tmp\\all_files.txt");
for (unsigned int i = 0; i<m_fileQueuer.size(); i++)
file << m_fileQueuer[i] << endl;
file.close();
所有文件名都写入C:\ tmp \ all_files.txt。 该文件包含大约168.000行/文件名。
当我选择整个驱动器C:并单击属性时,它会显示580.000个文件。
我做错了吗?
答案 0 :(得分:2)
dwFileAttributes
成员包含位标志。您的代码正在检查目录的属性仅是否设置了FILE_ATTRIBUTE_DIRECTORY
位;它不会遍历到设置了其他位的目录,例如FILE_ATTRIBUTE_HIDDEN
或FILE_ATTRIBUTE_SYSTEM
。
正确的检查应该是((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
,它基本上会拉出FILE_ATTRIBUTE_DIRECTORY
位并检查它是否已设置。