std::filesystem:: directory_iterator
|
定義済みヘッダー
<filesystem>
|
||
|
class
directory_iterator
;
|
(C++17以降) | |
directory_iterator
は、ディレクトリの
LegacyInputIterator
であり、ディレクトリ内の
directory_entry
要素を反復処理します(ただし、サブディレクトリにはアクセスしません)。反復順序は未規定ですが、各ディレクトリエントリは一度だけ訪問されます。特別なパス名である
dot
および
dot-dot
はスキップされます。
directory_iterator
がエラーを報告するか、最後のディレクトリエントリを超えて進められた場合、それはデフォルト構築されたイテレータ(終端イテレータとも呼ばれる)と等しくなります。2つの終端イテレータは常に等しく、終端イテレータのデリファレンスまたはインクリメントは未定義動作です。
ディレクトリイテレータが作成された後にファイルやディレクトリがディレクトリツリーから削除または追加された場合、その変更がイテレータを通じて観察されるかどうかは未規定です。
目次 |
メンバー型
| メンバー型 | 定義 |
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) |
|
|
(destructor)
|
デフォルトデストラクタ
(public member function) |
|
内容を代入する
(public member function) |
|
|
指し示すエントリにアクセスする
(public member function) |
|
|
次のエントリに進む
(public member function) |
非メンバー関数
|
範囲ベースforループサポート
(関数) |
さらに、
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は範囲forループで反復処理可能 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は他の方法でも範囲として振る舞う 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'; // sandboxディレクトリとその中のすべての内容(サブディレクトリを含む)を削除 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++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3480 | C++20 |
directory_iterator
は
borrowed_range
でも
view
でもなかった
|
両方である |
関連項目
|
(C++17)
|
ディレクトリとそのサブディレクトリの内容に対するイテレータ
(クラス) |
|
(C++17)
|
ディレクトリ内容の反復処理オプション
(列挙型) |
|
(C++17)
|
ディレクトリエントリ
(クラス) |