我正在遍历一个目录,当一个项目符合某些条件时,我将其删除。我可以从循环中安全地执行此操作,还是必须将路径保存在数组中并稍后删除?
我在boost::filesystem docs中没有找到相关信息。
我正在遍历一个目录,当一个项目符合某些条件时,我将其删除。我可以从循环中安全地执行此操作,还是必须将路径保存在数组中并稍后删除?
我在boost::filesystem docs中没有找到相关信息。
引用boost::filesystem::directory_iterator 文档所附注释的第一部分(重点是我自己的):
执行目录迭代的程序可能希望测试通过取消引用目录迭代器获得的路径是否确实存在。它可能是指向不存在文件的符号链接。出于删除和重命名条目的目的而递归遍历目录树的程序可能希望避免遵循符号链接。
我很清楚,为了删除文件而迭代目录是官方支持的用例,因此不会使迭代器无效。另外,引用该说明的第二部分:
如果在为目录构建 directory_iterator 之后从目录中删除或添加文件,则未指定迭代器的后续递增是否会导致迭代器的值是已删除或添加的目录条目。参见 ISO/IEC 9945 readdir_r()。
这是关于在遍历目录时是否会出现已删除文件的非常具体的声明。同样,我知道迭代过程本身在任何情况下都保持有效。
请注意,ISO/IEC 9945有类似的措辞。
在 Windows 上确实如此,但我发现了一个 Ubuntu,在该 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++;
}
}
}