[英]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)
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.