【问题标题】:The std::filesystem::recursive_directory_iterator exceptionstd::filesystem::recursive_directory_iterator 异常
【发布时间】:2018-09-13 16:44:03
【问题描述】:

如下函数:

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

当用于:

int main()
{
    std::string p = "C:\\";
    foo(p);
}

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

recursive_directory_iterator::operator++: The system cannot find the path specified.

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

【问题讨论】:

  • 您在 Windows 10 中有一个 Documents and Settings 文件夹吗?
  • 同意应该是Users 说我怀疑这是一个权限问题,因为普通用户无权遍历此类文件夹的子文件夹。
  • 如果 Windows 10 是从 Windows 7 升级的,可能是一个剩余的连接点。
  • @Eljay Windows 7 也有一个用户文件夹。 IIRC Windows XP 是最后一个拥有 Documents and Settings 文件夹的。
  • @NathanOliver • XP 有一个 Documents and Settings 文件夹。 Windows 7 使用一个连接点来向后兼容 XP 时代的应用程序。 (怎么没人再谈 Vista 了?哈哈)

标签: c++ windows-10 c++17


【解决方案1】:

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

解决方法是利用适当的 recursive directory iterator 构造函数重载(第 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';
}

【讨论】:

  • 遗憾的是,fs::recursive_directory_iterator(".", fs::directory_options::follow_directory_symlink | fs::directory_options::skip_permission_denied) 仍然会因相同的异常而崩溃,例如在非本地文件系统(如 ext2)上,文件名包含对本地 Windows API 无效的字符。
  • 这还不够。例如“C:\PerfLogs”为 777,但系统不允许普通用户查看其内容。 NTFS / Windows 似乎还有另一个级别的“权限”。
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多