【发布时间】:2022-01-19 17:39:04
【问题描述】:
在 macOS 上使用 C++20 和 std::filesystem::recursive_directory_iterator,此代码:
for (auto& f : recursive_directory_iterator(getenv("HOME"), directory_options::skip_permission_denied)) {
// dummy
}
根据我对文档的理解,哪个应该跳过它无权递归到的目录,在尝试递归到~/Library/Application Support/MobileSync/时遇到错误。
但是:
in recursive_directory_iterator::operator++(): attempting recursion into "/Users/t/Library/Application Support/MobileSync": Operation not permitted
我认为这意味着存在一些权限/安全功能,即使存在 skip_permission_denied,迭代器也不会跳过 - 这可能是什么,以及我如何让迭代器干净利落地跳过导致无论权限如何,它都会中断?
当遇到导致此问题的已知目录(如 MobileSync 或 .Trash)时,我可以手动 disable_recursion_pending(),但与能够提前检测目录何时会导致此问题相比,这将是一个混乱的解决方案。
【问题讨论】:
-
“Operation not allowed”是
EPERM,而不是通常的EACCES(“Permission denied”),大概是因为macOS想要表明失败是由于需要提升的权限而不是需要不同的权限模式位(因为它们破坏了 Unix,因此后者在这种情况下无效)。 -
我也有同样的问题。即使我设法处理了错误,我似乎也无法在迭代器中“继续”传递这个问题条目,尽管已经设置了 disable_recursion_pending()(发布错误)。
-
@FreudianSlip:我猜你在基于范围的 for 中尝试了 for 使用迭代器的副本,因为这是
fs::begin(iter)返回的内容,disable_recursion_pending()在你的预复制实例。
标签: c++ permissions std std-filesystem