std::filesystem::recursive_directory_iterator
| ヘッダ <filesystem> で定義
|
||
class recursive_directory_iterator; |
(C++17以上) | |
recursive_directory_iterator は、あるディレクトリの directory_entry およびそのすべてのサブディレクトリのエントリを再帰的にイテレートする LegacyInputIterator です。 それぞれのディレクトリエントリを一度だけアクセスすることを除き、イテレートする順序は未規定です。
デフォルトではシンボリックリンクは辿られませんが、構築時にディレクトリオプション follow_directory_symlink を指定すると、これを有効化できます。
特別なパス名ドットおよびドット-ドットはスキップされます。
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 |
メンバ関数
| 再帰的ディレクトリイテレータを構築します (パブリックメンバ関数) | |
デストラクタ |
デフォルトデストラクタ (パブリックメンバ関数) |
観察 | |
| 指している先のエントリにアクセスします (パブリックメンバ関数) | |
| イテレーションに影響を与える現在アクティブなオプションを返します (パブリックメンバ関数) | |
| 現在の再帰の深さを返します (パブリックメンバ関数) | |
| カレントディレクトリに対して再帰が無効化されているかどうか調べます (パブリックメンバ関数) | |
変更 | |
| 内容を代入します (パブリックメンバ関数) | |
| 次のエントリに進みます (パブリックメンバ関数) | |
| イテレータをディレクトリ階層の1階層上へ移動します (パブリックメンバ関数) | |
| 次のインクリメントまで再帰を無効化します (パブリックメンバ関数) | |
非メンバ関数
| 範囲ベースの for ループサポート (関数) |
さらに、 LegacyInputIterator によって要求される通りに、メンバまたは非メンバのいずれかとして、 operator== および operator!= が提供されます。
ノート
recursive_directory_iterator は一般的には (LegacyInputIterator のシャローコピーの意味論を満たすために) 以下の内容を保持する処理系依存のオブジェクトへの参照カウント管理されたポインタを保持します。
- 再帰スタックを形成する、非再帰 directory_iterator のコンテナ
- 再帰の深さを保持するカウンタ (depth() でアクセスできます)
- 構築時に使用されたディレクトリオプション (options() でアクセスできます)
- 保留再帰フラグ (recursion_pending() でアクセスできます。 空間を節約するためディレクトリオプションと一緒になっている場合もあります)
例
#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::create_directories("sandbox/a/b");
std::ofstream("sandbox/file1.txt");
fs::create_symlink("a", "sandbox/syma");
for(auto& p: fs::recursive_directory_iterator("sandbox"))
std::cout << p.path() << '\n';
fs::remove_all("sandbox");
}
出力例:
"sandbox/a"
"sandbox/a/b"
"sandbox/file1.txt"
"sandbox/syma"
関連項目
(C++17) |
ディレクトリの内容のイテレータ (クラス) |
(C++17) |
ディレクトリエントリ (クラス) |
(C++17) |
ディレクトリ内容のイテレートのためのオプション (列挙) |