Namespaces
Variants

std::filesystem:: directory_iterator

From cppreference.net
Definiert im Header <filesystem>
class directory_iterator ;
(seit C++17)

directory_iterator ist ein LegacyInputIterator der über die directory_entry -Elemente eines Verzeichnisses iteriert (jedoch keine Unterverzeichnisse besucht). Die Iterationsreihenfolge ist nicht spezifiziert, außer dass jeder Verzeichniseintrag genau einmal besucht wird. Die speziellen Pfadnamen dot und dot-dot werden übersprungen.

Wenn der directory_iterator einen Fehler meldet oder über den letzten Verzeichniseintrag hinaus bewegt wird, wird er gleich dem standardkonstruierten Iterator, auch bekannt als End-Iterator. Zwei End-Iteratoren sind immer gleich, das Dereferenzieren oder Inkrementieren des End-Iterators ist undefiniertes Verhalten.

Wenn eine Datei oder ein Verzeichnis nach der Erstellung des Verzeichnis-Iterators aus dem Verzeichnisbaum gelöscht oder hinzugefügt wird, ist nicht spezifiziert, ob die Änderung durch den Iterator beobachtet wird.

Inhaltsverzeichnis

Mitgliedertypen

Mitgliedtyp Definition
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

Memberfunktionen

Konstruiert einen Directory-Iterator
(öffentliche Elementfunktion)
(destructor)
Standard-Destruktor
(öffentliche Elementfunktion)
weist Inhalte zu
(öffentliche Elementfunktion)
greift auf den referenzierten Eintrag zu
(öffentliche Elementfunktion)
wechselt zum nächsten Eintrag
(öffentliche Elementfunktion)

Nicht-Member-Funktionen

Unterstützung für bereichsbasierte for-Schleifen
(Funktion)

Zusätzlich werden operator== und operator!= bereitgestellt (bis C++20) operator== wird bereitgestellt (seit C++20) wie von LegacyInputIterator gefordert.

Es ist nicht spezifiziert ob operator!= bereitgestellt wird, da es aus operator== synthetisiert werden kann, und (seit C++20) ob ein Gleichheitsoperator ein Member oder Non-Member ist.

Helfer-Spezialisierungen

template <>

constexpr bool

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

constexpr bool

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

Diese Spezialisierungen für directory_iterator machen es zu einem borrowed_range und einem view .

Hinweise

Viele Low-Level-Betriebssystem-APIs für das Durchlaufen von Verzeichnissen rufen Dateiattribute zusammen mit dem nächsten Verzeichniseintrag ab. Die Konstruktoren und die nicht-konstanten Memberfunktionen von std::filesystem::directory_iterator speichern diese Attribute, falls vorhanden, im referenzierten std::filesystem::directory_entry ohne Aufruf von directory_entry::refresh , was es ermöglicht, die Attribute der Verzeichniseinträge während der Iteration zu untersuchen, ohne zusätzliche Systemaufrufe durchzuführen.

Beispiel

#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 kann mit einer Range-for-Schleife durchlaufen werden
    for (auto const& dir_entry : std::filesystem::directory_iterator{sandbox}) 
        std::cout << dir_entry.path() << '\n';
    std::cout << "\ndirectory_iterator als Range:\n";
    // directory_iterator verhält sich auch in anderer Hinsicht wie eine Range
    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';
    // Lösche das Sandbox-Verzeichnis und alle Inhalte darin, einschließlich Unterverzeichnisse
    std::filesystem::remove_all(sandbox);
}

Mögliche Ausgabe:

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"

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3480 C++20 directory_iterator war weder ein borrowed_range noch eine view es ist beides

Siehe auch

Ein Iterator für die Inhalte eines Verzeichnisses und seiner Unterverzeichnisse
(Klasse)
Optionen für die Iteration von Verzeichnisinhalten
(Enumeration)
Ein Verzeichniseintrag
(Klasse)