如何使用递归目录迭代器继续到迭代器中的下一项
How to continue to next item in iterator using recursive_directory_iterator
我目前正在遍历一个文件系统。我想捕获发生的任何错误,然后继续迭代。当前行为如果发生错误,它将把当前迭代器设置到末尾,然后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;
}
}
相关文章:
- 使用迭代器替换映射中的常量项的方法
- 如何通过查找迭代器结果分配给一组对的元素
- 在 c++ 中定义一组 set 的迭代器
- 是否有一种方法可以使用Boost Serialization序列化迭代器
- 如何将一组二进制树的迭代器划分
- 使用迭代器时遇到问题,每 M 次传递一次擦除一个向量项
- 如果对于某些有序的容器s,例如迭代器s.begin(),例如x,例如S是一组
- 输入迭代器可以重复读取,而输出迭代器只能写入一次
- 接受迭代器的初始值设定项列表构造函数
- 异常处理.一个人如何抛出迭代器
- 指向同一项的两个映射迭代器是否保证相等
- 提升 python 容器、迭代器和项的生存期
- 如何使用迭代器达到列表项的值
- 使用CPP中的迭代器在一排矢量的2D矩阵上迭代
- 如何在容器项的字段上创建迭代器?
- 容器末端和指向内部项的迭代器之间的区别.C++
- 从输入迭代器获取最后一项
- 容器和迭代器(多项选择题)
- C++迭代器是否能够在传递最后一项后递减
- 迭代器循环不计算最后一项