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