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