如何使用递归目录迭代器继续到迭代器中的下一项

How to continue to next item in iterator using recursive_directory_iterator

本文关键字:迭代器 一项 递归 何使用 继续      更新时间:2024-05-09

我目前正在遍历一个文件系统。我想捕获发生的任何错误,然后继续迭代。当前行为如果发生错误,它将把当前迭代器设置到末尾,然后for循环退出。我希望这件事跳过这条路继续下去。

try {
for (const auto& dirEntry : recursive_directory_iterator(myPath)) {
std::cout << dirEntry << std::endl;
}
} catch (...) {
std::cout << "ERROR" << std::endl;
//continue iteration
}

编辑:这是我正在处理的小样本。错误发生在recursive_directory_iterator上。具体来说,当访问一个它没有权限访问的文件夹时,它会出错。我知道我可以添加std::filesystem::directory_options::skip_permission_denied,它会跳过这些文件夹,但一般情况下只是错误呢?我不确定这种情况是否会发生,所以也许我想得太多了?权限会是导致此错误的唯一原因吗?

您无法从recursive_directory_iterator中的错误中恢复。

如果recursive_directory_iterator报告错误或前进超过顶级目录的最后一个目录条目,则它将等于默认构造的迭代器,也称为结束迭代器。

来自cppreference

只需将try/catch放入for循环:

for (const auto& dirEntry : recursive_directory_iterator(myPath)) {
try {
std::cout << dirEntry << std::endl;
} catch (...) {
std::cout << "ERROR" << std::endl;
//continue iteration
}
}

您可以在构造迭代器时传递对错误代码的引用,而不是让迭代器抛出异常,该引用将用于存储迭代过程中发现的任何错误。然后可以在循环中检查错误代码,以检查迭代期间是否发生任何错误:

std::error_code ec{};
for (const auto& entry : std::filesystem::recursive_directory_iterator(..., ec)) 
{
if (ec)
{
// handle error...
ec = std::error_code{};
continue;
}
}