std::filesystem:: recursive_directory_iterator
|
定義済みヘッダー
<filesystem>
|
||
|
class
recursive_directory_iterator
;
|
(C++17以降) | |
recursive_directory_iterator
は、
LegacyInputIterator
であり、ディレクトリの
directory_entry
要素を反復処理し、さらに再帰的にすべてのサブディレクトリのエントリを反復処理します。反復順序は未規定ですが、各ディレクトリエントリは一度だけ訪問されることが保証されます。
デフォルトでは、シンボリックリンクは追従されませんが、これは構築時にディレクトリオプション follow_directory_symlink を指定することで有効にすることができます。
特別なパス名 dot および dot-dot はスキップされます。
recursive_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 |
メンバー関数
|
recursive directory iteratorを構築する
(public member function) |
|
|
(destructor)
|
デフォルトデストラクタ
(public member function) |
Observers |
|
|
指し示すエントリにアクセスする
(public member function) |
|
|
イテレーションに影響する現在アクティブなオプションを返す
(public member function) |
|
|
現在の再帰深度を返す
(public member function) |
|
|
現在のディレクトリに対して再帰が無効化されているかチェックする
(public member function) |
|
Modifiers |
|
|
内容を代入する
(public member function) |
|
|
次のエントリに進む
(public member function) |
|
|
ディレクトリ階層で1レベル上にイテレータを移動する
(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以降) | |
recursive_directory_iteratorのこれらの特殊化は、それを
borrowed_range
および
view
にします。
注記
recursive_directory_iteratorは通常、参照カウント方式の
ポインタ(
LegacyInputIterator
のシャローコピーセマンティクスを満たすため)を保持しており、これは以下の要素を保持する実装オブジェクトを指します:
- 再帰スタックを形成する非再帰の directory_iterator s のコンテナ(例: std::vector )、
- 再帰深度カウンタ( depth() でアクセス可能)、
- 構築時に使用されたディレクトリオプション( options() でアクセス可能)、
- 保留中の再帰フラグ( recursion_pending() でアクセス可能、スペース節約のためディレクトリオプションと組み合わせることができる)。
例
#include <filesystem> #include <fstream> #include <iostream> #include <string> namespace fs = std::filesystem; int main() { std::filesystem::current_path(std::filesystem::temp_directory_path()); std::filesystem::create_directories("sandbox/a/b"); std::ofstream("sandbox/file1.txt"); std::filesystem::create_symlink("a", "sandbox/syma"); // std::filesystem::directory_entry要素を明示的に反復処理 auto entry_length{3UZ}; for (const fs::directory_entry& dir_entry : fs::recursive_directory_iterator("sandbox")) { std::cout << dir_entry << '\n'; if (auto l{dir_entry.path().string().length()}; entry_length < l) entry_length = l; } std::cout << std::string(entry_length + 2, '-') << '\n'; // `auto`を使用してstd::filesystem::directory_entry要素を反復処理 for (auto const& dir_entry : fs::recursive_directory_iterator("sandbox")) std::cout << dir_entry << '\n'; std::filesystem::remove_all("sandbox"); }
出力例:
"sandbox/syma" "sandbox/file1.txt" "sandbox/a" "sandbox/a/b" ------------------- "sandbox/syma" "sandbox/file1.txt" "sandbox/a" "sandbox/a/b"
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3480 | C++20 |
recursive_directory_iterator
は
borrowed_range
でも
view
でもなかった
|
両方である |
関連項目
|
(C++17)
|
ディレクトリの内容に対するイテレータ
(クラス) |
|
(C++17)
|
ディレクトリエントリ
(クラス) |
|
(C++17)
|
ディレクトリ内容の反復処理オプション
(列挙型) |