簡體   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