我想列出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 个文件。
我做错了什么吗?
最佳答案
dwFileAttributes
成员包含位标志。您的代码正在检查目录的属性仅是否具有FILE_ATTRIBUTE_DIRECTORY
位设置;它不会遍历到设置了额外位的目录,例如 FILE_ATTRIBUTE_HIDDEN
或 FILE_ATTRIBUTE_SYSTEM
.
正确的检查应该是((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
, 这基本上拉出了 FILE_ATTRIBUTE_DIRECTORY
位并检查它是否已设置。
关于c++ - 列出驱动器中的所有文件数量不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35663424/