std::filesystem::directory_iterator
來自 cppreference.com
< cpp | filesystem
定義於標頭檔案 <filesystem> |
||
class directory_iterator; |
(C++17 起) | |
directory_iterator
是一個 LegacyInputIterator,它迭代目錄中的 directory_entry 元素(但不訪問子目錄)。迭代順序未指定,但每個目錄條目只訪問一次。特殊路徑名 dot 和 dot-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 |
(C++20 起) | |
template<> constexpr bool |
(C++20 起) | |
這些 directory_iterator
的特化使其成為 borrowed_range
和 view
。
[編輯] 注意
許多用於目錄遍歷的低階 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 |
它兩者都是 |
[編輯] 另見
(C++17) |
指向目錄及其子目錄內容的迭代器 (class) |
(C++17) |
迭代目錄內容的選項 (enum) |
(C++17) |
目錄項 (class) |