Namespaces
Variants

std::filesystem:: directory_iterator

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

directory_iterator は、ディレクトリの LegacyInputIterator であり、ディレクトリ内の directory_entry 要素を反復処理します(ただし、サブディレクトリにはアクセスしません)。反復順序は未規定ですが、各ディレクトリエントリは一度だけ訪問されます。特別なパス名である dot および dot-dot はスキップされます。

directory_iterator がエラーを報告するか、最後のディレクトリエントリを超えて進められた場合、それはデフォルト構築されたイテレータ(終端イテレータとも呼ばれる)と等しくなります。2つの終端イテレータは常に等しく、終端イテレータのデリファレンスまたはインクリメントは未定義動作です。

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

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Member types、Member functions、Non-member functions、Helper specializations、Defect reports、See also)は原文のまま保持しました - HTMLタグ、属性、数値はすべて変更せず保持しました - 技術文書としての正確性と専門性を維持しました

メンバー型

メンバー型 定義
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)
(destructor)
デフォルトデストラクタ
(public member function)
内容を代入する
(public member function)
指し示すエントリにアクセスする
(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 :: directory_iterator > = true ;
(C++20以降)
template <>

constexpr bool

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

directory_iterator に対するこれらの特殊化は、それを borrowed_range および view にします。

注記

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

#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は範囲forループで反復処理可能
    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は他の方法でも範囲として振る舞う
    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';
    // sandboxディレクトリとその中のすべての内容(サブディレクトリを含む)を削除
    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"

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3480 C++20 directory_iterator borrowed_range でも view でもなかった 両方である

関連項目

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