我正在遍历一个目录,当一个项目符合某些条件时,我将其删除。我可以在循环中安全地完成它,或者我必须在数组中保存路径并稍后删除吗?
我在boost::filesystem docs中找不到相关信息。
答案 0 :(得分:8)
引用附加到docs of boost::filesystem::directory_iterator的注释的第一部分(强调是我自己的):
执行目录迭代的程序可能希望测试通过解引用目录迭代器获得的路径是否实际存在。它可能是指向不存在的文件的符号链接。 递归遍历目录树以删除和重命名条目的程序可能希望避免使用符号链接。
我清楚的是,为了删除文件而迭代目录是官方支持的用例,因此不会使迭代器无效。另外,引用该说明的第二部分:
如果在构造目录的directory_iterator之后从目录中删除或添加了文件,则未指定迭代器的后续增量是否会导致迭代器的值为已删除或添加的目录条目。参见ISO / IEC 9945 readdir_r()。
这是一个非常具体的声明,说明在迭代目录时是否会出现删除的文件。同样,我理解迭代过程本身在任何情况下都是有效的。
请注意,ISO/IEC 9945的措辞相似。
答案 1 :(得分:1)
在Windows上它是真的但是我发现了一个Ubuntu,在删除之后迭代器会失效,所以下一个访问会抛出异常。
所以我最终使用了这样的东西:
recursive_directory_iterator end;
for (recursive_directory_iterator itr(folderPath); itr != end; )
{
path filePath = *itr++;
if (is_regular_file(filePath) && filePath.string().find(filter) != std::string::npos)
{
if (remove(filePath))
{
removedFilesCounter++;
}
}
}