Namespaces
Variants

std::filesystem:: recursive_directory_iterator

From ja.cppreference.net
定義済みヘッダー <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

ranges:: enable_borrowed_range < std :: filesystem :: recursive_directory_iterator > = true ;
(C++20以降)
template <>

constexpr bool

ranges:: enable_view < std :: filesystem :: recursive_directory_iterator > = true ;
(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 でもなかった 両方である

関連項目

ディレクトリの内容に対するイテレータ
(クラス)
ディレクトリエントリ
(クラス)
ディレクトリ内容の反復処理オプション
(列挙型)