繁体   English   中英

遍历 C++ 中的所有目录和子目录

[英]iterating through all the directories and subdirectories in c++

我想使用std::filesystem::recursive_directory_iterator类来创建一个类方法,它遍历所有子目录并处理找到的 xml 文件。

我在互联网上找到的唯一方法是使用这样的 for 循环:

for (fs::directory_entry p : fs::recursive_directory_iterator("my_file"))
    do_something(p);

问题是我需要在函数调用之间存储我的迭代器(或至少它指向的位置),因为我一次只能处理一个文件。 我尝试像这样实现它:

class C {
private:
    std::filesystem::recursive_directory_iterator it;
    std::filesystem::directory_entry p;
public:
    C(std::filesystem::path);
    std::string find_file();
};

C::C(std::filesystem::path path)
{
    it = fs::recursive_directory_iterator(path);
    p = fs::directory_entry(it.begin());
}

std::string C::find_file()
{
    do { //using do while so my function won't load the same file twice
        ++p;
    } while (!is_xml(p.path()) && p != it.end());

}

但似乎std::filesystem::recursive_directory_iterator没有begin()end()方法,无法进行比较。

除了存储迭代器和有一个额外的条件之外,我不知道我的代码与工作范围循环有何不同。

如果您查看std::filesystem::recursive_directory_iterator 非成员函数,您会发现有:

// range-based for loop support
begin(std::filesystem::recursive_directory_iterator)
end(std::filesystem::recursive_directory_iterator)

然后std::filesystem::begin(recursive_directory_iterator), std::filesystem::end(recursive_directory_iterator)有更多细节:

end(recursive_directory_iterator)返回一个默认构造的 recursive_directory_iterator,作为结束迭代器。 参数被忽略。

所以你会检查it是否不等于std::end(it) ,所以看看是否还有更多的元素。 你必须增加it而不是p

在执行!is_xml(*it.path())之前,您还需要检查it != std::end(it)是否it != std::end(it) !is_xml(*it.path())

std::string C::find_file()
{
    do { //using do while so my function won't load the same file twice

        ++it;
    } while (it != std::end(it) && !is_xml(*it.path()));

}

recursive_directory_iterator本身已经是一个迭代器(它的名字说得很对),所以你根本不需要使用begin()end() 它实现了operator==operator!=operator->operator++ ,在这种情况下您只需要这些。

此外, p根本没有理由成为类成员。 它应该是find_file()的局部变量(实际上,这种情况下,它可以完全消除)。 并且循环应该是while循环而不是do..while循环,以防在输入find_file()时迭代器已经处于“结束”。

试试这个:

class C {
private:
    std::filesystem::recursive_directory_iterator it;
public:
    C(std::filesystem::path);
    std::string find_file();
};

C::C(std::filesystem::path path)
    : it(path)
{
}

std::string C::find_file()
{
    static std::filesystem::directory_iterator end;
    while (it != end) {
        auto p = it->path();
        if (is_xml(p))
            return p.string();
        ++it;
    }
    return "";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM