<experimental/filesystem> recursive_directory_iterator Klasse

Important

In diesem Artikel wird die recursive_directory_iterator Klasse aus der vorstandardlichen <experimental/filesystem> Implementierung der technischen Spezifikation des ISO C++-Dateisystems (N4100) beschrieben. Diese API ist nicht identisch mit der C++17-Klasse recursive_directory_iterator in <filesystem>. Es verwendet verschiedene Signaturen, einschließlich eines noexceptincrement und eines einzigen Formulars pop ohne error_code Überladung. Die experimentelle Implementierung wurde ab dem Toolset Microsoft Visual C++ (MSVC) 14.51 entfernt. Neuer Code sollte stattdessen die C++17-Klasse recursive_directory_iterator verwenden.

Beschreibt einen Eingabe-Iterator, der durch die Dateinamen in einem Verzeichnis sequenziert wird und möglicherweise rekursiv in Unterverzeichnisse absteigend ist. Bei einem Iterator Xgibt der Ausdruck *X ein Objekt der Klasse directory_entry zurück, das den Dateinamen und alles bekannte Über seinen Status umschließt.

Syntax

class recursive_directory_iterator;

Hinweise

Die Klassenspeicher:

  1. ein Objekt vom Typ stack<pair<directory_iterator, path>>, das hier für die Zwecke der Exposition aufgerufen mystack wird, die das Nest von Verzeichnissen zur Sequenz darstellt

  2. ein Hier aufgerufenes myentry Objekt des Typsdirectory_entry, das den aktuellen Dateinamen in der Verzeichnissequenz darstellt

  3. ein Objekt vom Typ bool, das hier aufgerufen wird no_push , wobei erfasst wird, ob rekursive Abstieg in Unterverzeichnisse deaktiviert ist.

  4. ein Objekt vom Typ directory_options, das hier genannt wird myoptions , welche die bei der Konstruktion festgelegten Optionen aufzeichnet

Ein vom Typ recursive_directory_iterator standard konstruiertes Objekt weist einen End-of-Sequence-Iterator auf mystack.top().first und stellt den End-of-Sequence-Iterator dar. Beispielsweise, wenn das Verzeichnis abc mit Einträgen def (einem Verzeichnis) def/ghiund jkldem Code:

for (recursive_directory_iterator next(path("abc")), end; next != end; ++next)
    visit(next->path());

Aufrufe visit mit den Argumenten path("abc/def/ghi") und path("abc/jkl"). Sie können die Sequenzierung über eine Verzeichnisunterstruktur auf zwei Arten qualifizieren:

  1. Ein Verzeichnis symlink wird nur gescannt, wenn Sie ein recursive_directory_iteratordirectory_options Argument erstellen, dessen Wert lautet directory_options::follow_directory_symlink.

  2. Wenn Sie aufrufen disable_recursion_pending, wird während eines Inkrements ein nachfolgendes Verzeichnis nicht rekursiv gescannt.

Constructors

Konstruktor Description
recursive_directory_iterator Erstellt ein Objekt vom Typ recursive_directory_iterator.

Memberfunktionen

Memberfunktion Description
Tiefe Gibt zurück mystack.size() - 1, also pval bei der Tiefe Null.
disable_recursion_pending Stores true in no_push.
increment Wechselt nacheinander zum nächsten Dateinamen.
Optionen Gibt myoptions zurück.
Pop Verschiebt den Iterator zum nächsten Eintrag in der nächsten unteren Tiefe.
recursion_pending Gibt !no_push zurück.

Betriebspersonal

Operator Description
operator!= Gibt !(*this == right) zurück.
operator= Die standardmäßigen Memberzuweisungsoperatoren verhalten sich erwartungsgemäß.
operator== Gibt nur zurück true , wenn beide *this und rechte End-of-Sequence-Iteratoren oder beide nicht End-of-Sequence-Iteratoren sind.
Operator* Gibt myentry zurück.
operator-> Gibt &**this zurück.
operator++ Erhöht die recursive_directory_iterator.

Anforderungen

Kopfball:<experimental/filesystem>

Namespace:std::experimental::filesystem

recursive_directory_iterator::d epth

Gibt zurück mystack.size() - 1, also pval bei der Tiefe Null.

int depth() const;

recursive_directory_iterator::d isable_recursion_pending

Stores true in no_push.

void disable_recursion_pending();

recursive_directory_iterator::increment

Wechselt nacheinander zum nächsten Dateinamen.

recursive_directory_iterator& increment(error_code& ec) noexcept;

Parameter

ec
Angegebener Fehlercode.

Hinweise

Die Funktion versucht, zum nächsten Dateinamen in der geschachtelten Sequenz zu wechseln. Wenn die Datei erfolgreich verläuft, wird dieser Dateiname in myentry; andernfalls wird ein Iterator für die Endsequenz erzeugt.

recursive_directory_iterator::operator!=

Gibt !(*this == right) zurück.

bool operator!=(const recursive_directory_iterator& right) const;

Parameter

right
Der recursive_directory_iterator Vergleich.

recursive_directory_iterator::operator=

Die standardmäßigen Memberzuweisungsoperatoren verhalten sich erwartungsgemäß.

recursive_directory_iterator& operator=(const recursive_directory_iterator&) = default;
recursive_directory_iterator& operator=(recursive_directory_iterator&&) = default;

Parameter

recursive_directory_iterator
Das recursive_directory_iterator kopierte In das recursive_directory_iterator.

recursive_directory_iterator::operator==

Gibt nur zurück true , wenn beide *this und rechte Iteratoren end-of-sequence iterators sind oder beide keine End-of-Sequence-Iteratoren sind.

bool operator==(const recursive_directory_iterator& right) const;

Parameter

right
Der recursive_directory_iterator Vergleich.

recursive_directory_iterator::operator*

Gibt myentry zurück.

const directory_entry& operator*() const;

recursive_directory_iterator::operator->

Gibt &**this zurück.

const directory_entry * operator->() const;

recursive_directory_iterator::operator++

Erhöht die recursive_directory_iterator.

recursive_directory_iterator& operator++();

recursive_directory_iterator operator++(int);

Parameter

int
Dummy-Argument. Es ist eine C++-Konvention, die nur verwendet wird, um den Postfix-Inkrementoperator vom Präfix-Inkrementoperator zu unterscheiden. Der C++-Standard erfordert, dass das Postfix-Formular einen Dummy-Int-Parameter verwendet.

Hinweise

Die erste Memberfunktion ruft increment()die Funktion auf und gibt dann zurück *this. Die zweite Memberfunktion erstellt eine Kopie des Objekts, ruft increment()auf und gibt dann die Kopie zurück.

recursive_directory_iterator::options

Gibt myoptions zurück.

directory_options options() const;

recursive_directory_iterator::p op

Verschiebt den Iterator zum nächsten Eintrag in der nächsten unteren Tiefe.

void pop();

Hinweise

Wenn depth() == 0, wird das Objekt zu einem Iterator für die Endsequenz. Andernfalls beendet die Memberfunktion das Scannen des aktuellen (tiefsten) Verzeichnisses und wird in der nächsten unteren Tiefe fortgesetzt.

recursive_directory_iterator::recursion_pending

Gibt !no_push zurück.

bool recursion_pending() const;

recursive_directory_iterator::recursive_directory_iterator

Erstellt ein Objekt vom Typ recursive_directory_iterator.

recursive_directory_iterator() noexcept;
explicit recursive_directory_iterator(const path& pval,
    directory_options opts = directory_options::none);

recursive_directory_iterator(const path& pval,
    directory_options opts,
    error_code& ec) noexcept;
recursive_directory_iterator(const path& pval,
    error_code& ec) noexcept;
recursive_directory_iterator(const recursive_directory_iterator&) = default;
recursive_directory_iterator(recursive_directory_iterator&&) = default;

Parameter

pval
Der angegebene Pfad.

error_code
Der angegebene Fehlercode.

opts
Die angegebenen Verzeichnisoptionen.

recursive_directory_iterator
Die recursive_directory_iterator Konstruktion recursive_directory_iterator soll eine Kopie sein.

Hinweise

Der erste Konstruktor erstellt einen End-of-Sequence-Iterator. Der zweite Konstruktor speichert und anmeldetmyoptionsfalseno_push sich und versucht dann, pval als Verzeichnis zu öffnen und zu lesen. Wenn er erfolgreich ist, initialisiert mystack er und myentry verweist auf den ersten Nicht-Verzeichnis-Dateinamen in der geschachtelten Sequenz. Wenn ein Fehler auftritt, wird ein Iterator für die Endsequenz erstellt.

Die dritten und vierten Konstruktoren verhalten sich genauso wie die zweite, mit der Ausnahme, dass sie Fehler in ec melden, anstatt eine Ausnahme zu auslösen. Der vierte Konstruktor speichert directory_options::none in myoptions. Der Standardkonstruktor verhält sich wie erwartet.

Siehe auch

<experimental/filesystem>
directory_entry-Klasse