std::filesystem::directory_iterator
| ヘッダー <filesystem> で定義 |
||
| class directory_iterator; |
(C++17以降) | |
directory_iterator は、ディレクトリのエントリ (ただしサブディレクトリは含まない) を走査する LegacyInputIterator です。走査順序は未規定ですが、各ディレクトリ エントリは一度だけ訪問されます。特殊なパス名である dot (カレントディレクトリ) と dot-dot (親ディレクトリ) はスキップされます。
directory_iterator がエラーを報告した場合、または最後のディレクトリ エントリを過ぎて進んだ場合、それはデフォルト構築されたイテレータ、すなわちエンド イテレータと等しくなります。2つのエンド イテレータは常に等しく、エンド イテレータのデリファレンスまたはインクリメントは未定義の動作です。
ディレクトリ イテレータが作成された後に、ファイルまたはディレクトリが削除されたり、ディレクトリ ツリーに追加されたりした場合、その変更がイテレータを通じて観測されるかどうかは未規定です。
目次 |
[edit] メンバ型
| メンバ型 | 定義 |
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 |
[edit] メンバ関数
| ディレクトリ イテレータを構築します (public member function) | |
| (デストラクタ) |
デフォルト デストラクタ (public member function) |
| 内容を代入する (public member function) | |
| 指しているエントリにアクセスします (public member function) | |
| 次のエントリに進みます (public member function) |
[edit] 非メンバ関数
| 範囲ベース for ループのサポート (function) |
さらに、operator== および operator!= は(C++20まで)operator== は(C++20以降) LegacyInputIterator で要求されるとおりに提供されます。
operator!= が提供されるかどうかは未規定です。これは operator== から合成できるためであり、また、等価演算子がメンバ関数か非メンバ関数かも未規定です。
[edit] ヘルパー特殊化
| template<> constexpr bool |
(C++20以降) | |
| template<> constexpr bool |
(C++20以降) | |
これらの directory_iterator の特殊化により、それは borrowed_range および view になります。
[edit] 注記
ディレクトリ走査のための多くの低レベル OS API は、次のディレクトリ エントリとともにファイル属性を取得します。std::filesystem::directory_iterator のコンストラクタおよび非 const メンバ関数は、これらの属性 (存在する場合) を、directory_entry::refresh を呼び出すことなく、指されている std::filesystem::directory_entry に格納します。これにより、追加のシステムコールを行わずに、イテレーション中にディレクトリ エントリの属性を検査することが可能になります。
[edit] 例
#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"
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3480 | C++20 | directory_iterator は borrowed_range でも view でもなくなかった |
両方である |
[edit] 関連項目
| (C++17) |
ディレクトリとそのサブディレクトリの内容を指すイテレータ (クラス) |
| (C++17) |
ディレクトリの内容をイテレートするためのオプション (列挙型) |
| (C++17) |
ディレクトリエントリ (クラス) |