std::filesystem::recursive_directory_iterator 异常

Ron*_*Ron 4 c++ windows-10 c++17

以下功能:

void foo(const std::string& dir)
{
    for (auto& el : std::filesystem::recursive_directory_iterator(dir)) {
            std::cout << el.path() << '\n';
    }
}
Run Code Online (Sandbox Code Playgroud)

当用于:

int main()
{
    std::string p = "C:\\";
    foo(p);
}
Run Code Online (Sandbox Code Playgroud)

当它到达 Windows 10 上的某个文件夹(我假设)时引发异常。代码是在 VS 2017 上编译的,支持 C++17。异常消息是:

recursive_directory_iterator::operator++: The system cannot find the path specified.
Run Code Online (Sandbox Code Playgroud)

使用std::filesystem::directory_iteratortoo时也会发生相同的行为。为什么会在该特定文件夹上引发异常?

Ron*_*Ron 5

显然,当操作系统拒绝访问其中一个文件夹的权限时会引发异常。

解决方法是利用适当的递归目录迭代器构造函数重载(第 4 个)并提供skip_permission_denied参数:

for (auto& el : std::filesystem::recursive_directory_iterator(dir, std::filesystem::directory_options::skip_permission_denied)) {
    std::cout << el.path() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是, `fs::recursive_directory_iterator(".", fs::directory_options::follow_directory_symlink | fs::directory_options::skip_permission_denied)` 仍然可能因相同的异常而崩溃,例如在文件名包含以下内容的非本机文件系统(如 ext2)上对本机 Windows API 无效的字符。 (2认同)
  • 这还不够。例如“C:\PerfLogs”是777,但系统不允许普通用户看到其内容。NTFS / Windows 似乎还有另一个级别的“权限”。 (2认同)