Verzeichnis auslesen
-
Hallo
Als kleine Aufgabe will ich ein Verzeichnis auslesen. Das klappt auch wunderprima. Nur will ich jetzt alles Sortieren, und zwar nach Unterordner und Dateien. So nach diesem Schema:
. .. Unterordner1 Unterordner2 Unterordner3 Datei1 Datei2 Datei3 Datei4
Wie kann ich das Realisieren?
Hier mal mein bisheriger Code:#include <iostream> #include <cstdio> #include <sys/types.h> #include <dirent.h> int main() { DIR *dirHandle; struct dirent *dirEntry; //Einen Ordner öffnen dirHandle = opendir("."); //Konnte der Ordner geöffnet werden? if ( dirHandle != NULL ) { //Alle Ordner/Dateien auslesen while ( 0 != ( dirEntry = readdir( dirHandle ) ) ) { puts( dirEntry->d_name ); } //Den Ordner schliessen closedir( dirHandle ); } std::cin.get(); return 0; }
Hier wird alles Sortiert ausgegeben( ohne Rücksicht auf Datei oder Unterordner )
MfG. Christoph Ludwig
-
Du könntest ein Verzeichnis z.B. in einer solchen Struktur festhalten (Pseudo-Code):
struct Verzeichnis { array Unterverzeichnisse; array Dateien; };
So könntest du sie einzeln sortieren und einfach hintereinander ausgeben.
-
Ja klar, Nur darum ging es mir nicht. Das mit dem Sortieren, speichern, ausgeben bekomme ich selber hin.
Nur wie unterscheide ich, ob dirEntry nun eine Datei oder ein Unterordner ist?
Ich kann ja nicht einfach prüfen, ob ein Punkt im Name vorkommt( wie dämlich ). Was gibts da für eine Funktion/Methode?
-
du könntest die funktion stat nutzen, die zwar nicht im standard vorkommt, aber bei den meisten kompilern vorhanden ist
-
#include <sys/stat.h> #include <unistd.h> //... struct stat entrystat; if (stat(dirEntry->d_name, &entrystat)) { cerr << "stat failed: " << strerror(errno) << endl; continue; } if (S_ISREG(entrystat.st_mode)) { /* datei */ } else if (strcmp(dirEntry->d_name, ".") && strcmp(dirEntry->d_name, "..") && S_ISDIR(entrystat.st_mode)) { /* verzeichnis */ }
-
Danke, so funktionierts!