名稱空間
變體
操作

std::filesystem::directory_iterator

來自 cppreference.com
 
 
 
 
定義於標頭檔案 <filesystem>
class directory_iterator;
(C++17 起)

directory_iterator 是一個 LegacyInputIterator,它迭代目錄中的 directory_entry 元素(但不訪問子目錄)。迭代順序未指定,但每個目錄條目只訪問一次。特殊路徑名 dotdot-dot 會被跳過。

如果 directory_iterator 報告錯誤或越過最後一個目錄條目,它將等同於預設構造的迭代器,也稱為結束迭代器。兩個結束迭代器總是相等的,對結束迭代器解引用或遞增是未定義行為。

如果在建立目錄迭代器之後,檔案或目錄被刪除或新增到目錄樹中,則透過迭代器是否能觀察到此更改是未指定的。

目錄

[編輯] 成員型別

成員型別 定義
value_type std::filesystem::directory_entry
difference_type std::ptrdiff_t
pointer const std::filesystem::directory_entry*
reference const std::filesystem::directory_entry&
iterator_category std::input_iterator_tag

[編輯] 成員函式

構造目錄迭代器
(public member function) [編輯]
(解構函式)
預設解構函式
(public member function) [編輯]
賦值內容
(public member function) [編輯]
訪問指向的條目
(public member function) [編輯]
前進到下一個條目
(public member function) [編輯]

[編輯] 非成員函式

支援基於範圍的 for 迴圈
(function) [編輯]

此外,operator==operator!=(直到 C++20)operator==(自 C++20 起) 作為 LegacyInputIterator 的要求而提供。

是否提供 operator!= 因為它可以從 operator== 合成,以及(自 C++20 起) 等價運算子是成員還是非成員未指定。

[編輯] 輔助特化

template<>

constexpr bool

    ranges::enable_borrowed_range<std::filesystem::directory_iterator> = true;
(C++20 起)
template<>

constexpr bool

    ranges::enable_view<std::filesystem::directory_iterator> = true;
(C++20 起)

這些 directory_iterator 的特化使其成為 borrowed_rangeview

[編輯] 注意

許多用於目錄遍歷的低階 OS API 在檢索下一個目錄條目的同時檢索檔案屬性。std::filesystem::directory_iterator 的建構函式和非 const 成員函式將這些屬性(如果有)儲存在指向的 std::filesystem::directory_entry 中,而無需呼叫 directory_entry::refresh,這使得可以在迭代目錄條目時檢查其屬性,而無需額外的系統呼叫。

[編輯] 示例

#include <algorithm>
#include <filesystem>
#include <fstream>
#include <iostream>
 
int main()
{
    const std::filesystem::path sandbox{"sandbox"};
    std::filesystem::create_directories(sandbox/"dir1"/"dir2");
    std::ofstream{sandbox/"file1.txt"};
    std::ofstream{sandbox/"file2.txt"};
 
    std::cout << "directory_iterator:\n";
    // directory_iterator can be iterated using a range-for loop
    for (auto const& dir_entry : std::filesystem::directory_iterator{sandbox}) 
        std::cout << dir_entry.path() << '\n';
 
    std::cout << "\ndirectory_iterator as a range:\n";
    // directory_iterator behaves as a range in other ways, too
    std::ranges::for_each(
        std::filesystem::directory_iterator{sandbox},
        [](const auto& dir_entry) { std::cout << dir_entry << '\n'; });
 
    std::cout << "\nrecursive_directory_iterator:\n";
    for (auto const& dir_entry : std::filesystem::recursive_directory_iterator{sandbox}) 
        std::cout << dir_entry << '\n';
 
    // delete the sandbox dir and all contents within it, including subdirs
    std::filesystem::remove_all(sandbox);
}

可能的輸出

directory_iterator:
"sandbox/file2.txt"
"sandbox/file1.txt"
"sandbox/dir1"
 
directory_iterator as a range:
"sandbox/file2.txt"
"sandbox/file1.txt"
"sandbox/dir1"
 
recursive_directory_iterator:
"sandbox/file2.txt"
"sandbox/file1.txt"
"sandbox/dir1"
"sandbox/dir1/dir2"

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3480 C++20 directory_iterator 既不是 borrowed_range 也不是 view 它兩者都是

[編輯] 另見

指向目錄及其子目錄內容的迭代器
(class) [編輯]
迭代目錄內容的選項
(enum) [編輯]
目錄項
(class) [編輯]