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

标签 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

我做错了什么吗?

最佳答案

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

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

关于c++ - 列出驱动器中的所有文件数量不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35663424/

相关文章:

windows - SVN命令更新而不恢复文件

c++ - 使用类类型中的字段定义类

c# - 如何获取 Windows 2008 和 .NET 中包含 "skipassource"地址的系统 IP 地址列表?

c++ - 构造函数中的初始化列表可以在模板类中使用吗?

c++ - 为什么 “std::isdigit”在Windows上的C++中报告 “no matching overloaded function”

c++ - Windows 上的临时文件和文件夹

c++ - 如何使用 C++ Win32 API 获取当前系统域 IP 地址?

windows - 在 Windows C/C++ 中检查文件夹/文件是否被隐藏/系统

c++ - 为我的 C++ 应用程序提供 SDK

c++ - 获取模板中的函数返回类型