我想列出在驅動器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個文件。
我做錯了什麼?
您缺少第一個文件。你調用FindFirstFile然後你立即調用FindNextFile。改爲使用它:'FindFirstFile(); {...} while('FindNextFile');'---同時添加錯誤檢查並在完成時關閉句柄if if(FirstFile!= INVALID_HANDLE_VALUE){... FindClose(FirstFile);}' –
謝謝,我也改善了! –
你應該檢查爲什麼FindNextFile完成,如果它不是NO_MORE_FILES你跳過一個目錄,可能是由於權限。 GetLastError會告訴你。 –