名前空間
変種
操作

std::filesystem::directory_iterator

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

directory_iterator は、ディレクトリのエントリ (ただしサブディレクトリは含まない) を走査する LegacyInputIterator です。走査順序は未規定ですが、各ディレクトリ エントリは一度だけ訪問されます。特殊なパス名である dot (カレントディレクトリ) と dot-dot (親ディレクトリ) はスキップされます。

directory_iterator がエラーを報告した場合、または最後のディレクトリ エントリを過ぎて進んだ場合、それはデフォルト構築されたイテレータ、すなわちエンド イテレータと等しくなります。2つのエンド イテレータは常に等しく、エンド イテレータのデリファレンスまたはインクリメントは未定義の動作です。

ディレクトリ イテレータが作成された後に、ファイルまたはディレクトリが削除されたり、ディレクトリ ツリーに追加されたりした場合、その変更がイテレータを通じて観測されるかどうかは未規定です。

目次

[edit] メンバ型

メンバ型 定義
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

[edit] メンバ関数

ディレクトリ イテレータを構築します
(public member function) [edit]
(デストラクタ)
デフォルト デストラクタ
(public member function) [edit]
内容を代入する
(public member function) [edit]
指しているエントリにアクセスします
(public member function) [edit]
次のエントリに進みます
(public member function) [edit]

[edit] 非メンバ関数

範囲ベース for ループのサポート
(function) [edit]

さらに、operator== および operator!=(C++20まで)operator==(C++20以降) LegacyInputIterator で要求されるとおりに提供されます。

operator!= が提供されるかどうかは未規定です。これは operator== から合成できるためであり、また、等価演算子がメンバ関数か非メンバ関数かも未規定です。

[edit] ヘルパー特殊化

template<>

constexpr bool

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

constexpr bool

    ranges::enable_view<std::filesystem::directory_iterator> = true;
(C++20以降)

これらの directory_iterator の特殊化により、それは borrowed_range および view になります。

[edit] 注記

ディレクトリ走査のための多くの低レベル OS API は、次のディレクトリ エントリとともにファイル属性を取得します。std::filesystem::directory_iterator のコンストラクタおよび非 const メンバ関数は、これらの属性 (存在する場合) を、directory_entry::refresh を呼び出すことなく、指されている std::filesystem::directory_entry に格納します。これにより、追加のシステムコールを行わずに、イテレーション中にディレクトリ エントリの属性を検査することが可能になります。

[edit]

#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 can be iterated using a range-for loop
    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 behaves as a range in other ways, too
    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';
 
    // delete the sandbox dir and all contents within it, including subdirs
    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"

[edit] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3480 C++20 directory_iteratorborrowed_range でも view でもなくなかった 両方である

[edit] 関連項目

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