名前空間
変種
操作

std::filesystem::recursive_directory_iterator

From cppreference.com
 
 
 
 
ヘッダー <filesystem> で定義
class recursive_directory_iterator;
(C++17以降)

recursive_directory_iteratorは、ディレクトリのエントリ、およびすべてのサブディレクトリのエントリを再帰的に走査するLegacyInputIteratorです。反復順序は未指定ですが、各ディレクトリエントリは一度だけ訪問されます。

デフォルトではシンボリックリンクはたどりませんが、構築時にディレクトリオプションfollow_directory_symlinkを指定することで有効にできます。

特殊なパス名dotdot-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

[編集] メンバー関数

再帰ディレクトリイテレータを構築します
(public member function) [編集]
(デストラクタ)
デフォルト デストラクタ
(public member function) [編集]
監視
指しているエントリにアクセスします
(public member function) [編集]
現在アクティブな、反復に影響するオプションを返します
(public member function) [編集]
現在の再帰深度を返します
(public member function) [編集]
現在のディレクトリの再帰が無効になっているかどうかをチェックします
(public member function) [編集]
変更
内容を代入する
(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のコンテナ(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");
 
    // Iterate over the std::filesystem::directory_entry elements explicitly
    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';
 
    // Iterate over the std::filesystem::directory_entry elements using `auto`
    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_iteratorborrowed_rangeでもviewでもありませんでした。 両方になります。

[編集] 関連項目

ディレクトリの内容を指すイテレータ
(クラス) [編集]
ディレクトリエントリ
(クラス) [編集]
ディレクトリの内容をイテレートするためのオプション
(列挙型) [編集]
English 日本語 中文(简体) 中文(繁體)