Wie der Inhalt eines Verzeichnisses in C ++ Get

Wenn Sie den Inhalt eines Verzeichnisses zu lesen möchten, Sie gehen wirklich gegen das, was in der Standard-C ++ Sprache verfügbar ist. Allerdings sind die guten Seelen der großen Bibliotheken von C ++ (das heißt, die Leute, die die meisten der verfügbaren C ++ Bibliotheken geschrieben) in der Regel in einigen praktischen Funktionen eingebaut, um den Inhalt eines Verzeichnisses zu bekommen.

Ein Verzeichnis enthält in der Regel mehrere Dateien sowie andere Verzeichnisse. ein Inhaltsverzeichnis zu erhalten ist beteiligt. Sie müssen nicht nur eine Funktion aufrufen und etwas zurück zu bekommen.

Natürlich, wenn die Standard C ++ Library eine Funktion zum Abrufen von Informationen enthalten, wäre es wahrscheinlich eine Template-Klasse sein, die den Inhalt des Verzeichnisses enthält. Leider hat die Bibliothek unterstützt es nicht. Stattdessen müssen Sie durch einige Funktionen klettern. So funktioniert das.

  1. Anruf _findfirst (), Leiten einen Pfadnamen und ein Muster für die Dateien, deren Namen Sie suchen möchten.

    Zum Beispiel passieren *. * Alle Dateien im Verzeichnis zu erhalten, oder *.txt erhalten alle Dateien mit der Endung .txt. geben sie auch einen Zeiger auf ein _finddata_t Struktur.

  2. Überprüfen Sie die Ergebnisse der _findfirst ().

    Ob _findfirst () ist zurückgekommen -1, es können keine Dateien (was bedeutet, dass Sie fertig sind). Ansonsten füllt es die _finddata_t Struktur mit der ersten Datei gefunden, und es wird eine Zahl, die Sie in nachfolgenden Aufrufen an die verschiedenen Fund Funktionen zurückzukehren.

  3. Schaue auf die _finddata_t Struktur den Namen der Datei und andere Informationen, um zu bestimmen, wie Datum, Datum des letzten Zugriffs erstellen und Größe.

  4. Anruf _nächstes finden() und geben Sie die folgenden Werte: die Zahl zurück aus _findfirst () und die Adresse einer _finddata_t Struktur

    Ob _nächstes finden() kehrt zurück -1, es fand keine mehr Dateien- Sie bei der Suche mit Schritt 5. Andernfalls gehen _finddata_t Struktur, die die Informationen für die nächste Datei gefunden zu erhalten. Dann wiederholen Sie Schritt 4.

  5. Anruf _findclose () und geben sie die Anzahl von zurück _findfirst ().

    Du bist alles fertig.

Youch! Das ist irgendwie seltsam, aber es ist die Art und Weise Dinge verwendet, um in den alten Tagen der Programmierung durchgeführt werden, bevor die Mainstream-Sprachen wie zivilisierte Merkmale wie die Klassen und Objekte entwickelt.

Das GetDirectoryContents Beispiel zeigt, wie Sie diese elegante, altmodische Prozess zu implementieren.

#einschließen # include # include # include using namespace std-string-Hieb (string str) {string res = str-int len ​​= str.length () - if (str [len - 1] == ' r') {res.replace (len - 1, 1, "") -} len = str.length () - if (str [len - 1] == ' n') {res.replace (len - 1, 1, "") -} return Resona} void DumpEntry (_finddata_t Daten) {string create (ctime (data.time_create)) - cout lt; lt; Kotelett (create) lt; lt; " T" -cout lt; lt; data.size lt; lt; " T" -wenn ((data.attrib _A_SUBDIR) == _A_SUBDIR) {Cout lt; lt; "[" lt; lt; data.name lt; lt; "]" lt; lt; endl-} else {cout lt; lt; data.name lt; lt; Endl -}} int main () {_ finddata_t Daten-int ff = _findfirst ( "../*.*", Daten) -wenn (ff! = -1) {int res = 0-while (res! = -1) {DumpEntry (Daten) -res = _findnext (ff, Daten) -} _ findclose (ff) -} return 0-}

Sie können sehen, wie Main()folgt die Schritte aus nur. Und für jede der Datenstrukturen, die Funktion aufgerufen DumpEntry () wurde benutzt. Das DumpEntry () Funktion druckt die Informationen über die Datei aus. Hier ist, was Sie sollten sehen, wenn Sie die Anwendung ausführen (das aktuelle Verzeichnis-Eintrag, das übergeordnete Verzeichnis-Eintrag, und die vier Verzeichnisse mit anderen Beispiele):

Sun 15. Dezember 19.40.00 20130 [.] Sun 15. Dezember 19.40.00 20130 [..] Sun 15. Dezember 19.40.00 20130 [DeleteDirectory] Sun 15. Dezember 19.40.00 20130 [GetDirectoryContents] Sun 15. Dezember 19.40.00 20130 [MakeDirectory] Sun 15. Dezember 19.40.00 20130 [RenameFile]

Beachten Sie, wie in der DumpEntry () Funktion, Sie testen, ob das Objekt ein Verzeichnis ist. Dies ist eine weitere alte (aber zuverlässig) Weg zum Programm: Überprüfen Sie das Vorhandensein eines bestimmten ganz klein wenig in der Mitte der attrib Mitglied der Struktur, wie folgt aus:

if (data.attrib _A_SUBDIR == _A_SUBDIR) {Cout lt; lt; "[" lt; lt; data.name lt; lt; "]" lt; lt; endl-}

Und schließlich werden Sie feststellen, eine seltsame Funktion aufgerufen enthalten Hacken(). Das ist, weil die ctime () Funktion - sonst praktisch für die Formatierung der Zeit - fügt einen Wagenrücklauf (oder Neue Zeile) Bis zum Ende der Zeichenkette, die es erzeugt. So hacken, dass ab. Ansonsten könnten die Informationen nach dem Datum hat auf der nächsten Textzeile zu starten, was nicht erwünscht war.

Menü