Namespaces
Variants

std::filesystem:: recursive_directory_iterator

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

recursive_directory_iterator ist ein LegacyInputIterator , der über die directory_entry -Elemente eines Verzeichnisses und rekursiv über die Einträge aller Unterverzeichnisse iteriert. Die Iterationsreihenfolge ist nicht spezifiziert, außer dass jeder Verzeichniseintrag nur einmal besucht wird.

Standardmäßig werden symbolischen Verknüpfungen nicht gefolgt, dies kann jedoch durch Angabe der Verzeichnisoption follow_directory_symlink zur Konstruktionszeit aktiviert werden.

Die speziellen Pfadnamen dot und dot-dot werden übersprungen.

Wenn der recursive_directory_iterator einen Fehler meldet oder über den letzten Verzeichniseintrag des obersten Verzeichnisses hinaus bewegt wird, wird er gleich dem standardmäßig konstruierten 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 rekursiven Verzeichnis-Iterators aus dem Verzeichnisbaum gelöscht oder hinzugefügt wird, ist es nicht spezifiziert, ob die Änderung durch den Iterator beobachtet wird.

Wenn die Verzeichnisstruktur Zyklen enthält, könnte der End-Iterator unerreichbar sein.

Inhaltsverzeichnis

Mitgliedertypen

Mitgliedstyp 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 rekursiven Verzeichnisiterator
(öffentliche Elementfunktion)
(destructor)
Standard-Destruktor
(öffentliche Elementfunktion)
Beobachter
greift auf den referenzierten Eintrag zu
(öffentliche Elementfunktion)
gibt die aktuell aktiven Optionen zurück, die die Iteration beeinflussen
(öffentliche Elementfunktion)
gibt die aktuelle Rekursionstiefe zurück
(öffentliche Elementfunktion)
prüft, ob die Rekursion für das aktuelle Verzeichnis deaktiviert ist
(öffentliche Elementfunktion)
Modifikatoren
weist Inhalte zu
(öffentliche Elementfunktion)
wechselt zum nächsten Eintrag
(öffentliche Elementfunktion)
bewegt den Iterator eine Ebene höher in der Verzeichnishierarchie
(öffentliche Elementfunktion)
deaktiviert die Rekursion bis zum nächsten Inkrement
(ö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 :: recursive_directory_iterator > = true ;
(seit C++20)
template <>

constexpr bool

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

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

Hinweise

Ein recursive_directory_iterator enthält typischerweise einen referenzgezählten Zeiger (um die Flachkopie-Semantik von LegacyInputIterator zu erfüllen) auf ein Implementierungsobjekt, welches Folgendes speichert:

  • ein Container (wie std::vector ) von nicht-rekursiven directory_iterator s , der den Rekursionsstapel bildet,
  • der Rekursionstiefenzähler (zugänglich mit depth() ),
  • die bei der Konstruktion verwendeten Verzeichnisoptionen (zugänglich mit options() ),
  • das Flag für ausstehende Rekursion (zugänglich mit recursion_pending() , kann mit den Verzeichnisoptionen kombiniert werden, um Speicherplatz zu sparen).

Beispiel

#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");
    // Explizite Iteration über std::filesystem::directory_entry Elemente
    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';
    // Iteration über std::filesystem::directory_entry Elemente mit `auto`
    for (auto const& dir_entry : fs::recursive_directory_iterator("sandbox"))
        std::cout << dir_entry << '\n';
    std::filesystem::remove_all("sandbox");
}

Mögliche Ausgabe:

"sandbox/syma"
"sandbox/file1.txt"
"sandbox/a"
"sandbox/a/b"
-------------------
"sandbox/syma"
"sandbox/file1.txt"
"sandbox/a"
"sandbox/a/b"

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 recursive_directory_iterator war weder ein borrowed_range noch eine view es ist beides

Siehe auch

Ein Iterator für die Inhalte des Verzeichnisses
(Klasse)
Ein Verzeichniseintrag
(Klasse)
Optionen für die Iteration von Verzeichnisinhalten
(Enumeration)