在删除周期

时间:2017-01-18 08:22:57

标签: c++ boost

我发现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_iteratorrecursive_directory_iterator与[{1}} iterator相同的结构。

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

recursive_directory_range

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

  

filesystem :: recursive_directory_iterator目录错误:没有这样的文件   或目录

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

1 个答案:

答案 0 :(得分:1)

来自文档reference):

  

如果在构造目录的directory_iterator之后从目录中删除或添加了文件,则未指定迭代器的后续增量是否会导致迭代器的值为已删除或添加的目录条目

此外:

  

取消引用directory_iterator的连续增量返回的路径条目的顺序是未指定的。

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

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