std::filesystem:: recursive_directory_iterator
|
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
|
(seit C++20) | |
|
template
<>
constexpr
bool
|
(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
|
(C++17)
|
Ein Iterator für die Inhalte des Verzeichnisses
(Klasse) |
|
(C++17)
|
Ein Verzeichniseintrag
(Klasse) |
|
(C++17)
|
Optionen für die Iteration von Verzeichnisinhalten
(Enumeration) |