gpt4 book ai didi

c++ - 在循环内删除文件时 boost recursive_directory_iterator 失效

转载 作者:行者123 更新时间:2023-11-30 05:18:28 27 4
gpt4 key购买 nike

我发现 boost::recursive_directory_iterator 与 boost::directory_iterator 有不同的行为

所以我有两个结构:

struct directory_range
{
typedef bfs::directory_iterator iterator;

directory_range(bfs::path p) : m_p(p) {}

iterator begin() { return bfs::directory_iterator(m_p); }

iterator end() { return bfs::directory_iterator(); }

bfs::path m_p;
};

一个具有directory_iterator 并且具有与recursive_directory_iterator 相同的结构作为iterator recursive_directory_range

我像这样在循环中使用它们:

for (const auto &it : directory_range(folder)) {
if(expression){
std::cout << "\n :clean: removing file : " << it.path();
bfs::remove(it.path());
}
}

当我使用 directory_range 时,一切都很好。当我在第一次删除后切换到 recursive_directory_range 时,我得到了

filesystem::recursive_directory_iterator directory error: No such file or directory

我不知道为什么,因为在文档中有关于这两个迭代器的相同声明,即在循环中删除时它们不会失效。

最佳答案

来自文档 ( reference ):

If a file is removed from or added to a directory after the construction of a directory_iterator for the directory, it is unspecified whether or not subsequent incrementing of the iterator will ever result in an iterator whose value is the removed or added directory entry.

还有:

The order of the path entries returned by dereferencing successive increments of a directory_iterator is unspecified.

原因:这里最有可能发生的情况是您正在删除一个尚未递归迭代的目录,因此您得到了错误。

解决方案:可能有多种解决方案,例如,您可以编写自己的递归函数,该函数仅使用非递归目录迭代器,首先下降到子目录,然后删除文件在所有子路径都返回之后。

关于c++ - 在循环内删除文件时 boost recursive_directory_iterator 失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41714427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com