列出驱动器中的所有文件数量不等?

时间:2016-02-26 23:12:23

标签: c++ windows winapi

我想列出驱动器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个文件。 enter image description here enter image description here

我做错了吗?

1 个答案:

答案 0 :(得分:2)

dwFileAttributes成员包含位标志。您的代码正在检查目录的属性是否设置了FILE_ATTRIBUTE_DIRECTORY位;它不会遍历到设置了其他位的目录,例如FILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_SYSTEM

正确的检查应该是((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY),它基本上会拉出FILE_ATTRIBUTE_DIRECTORY位并检查它是否已设置。