Verzeichnisse
-
Hallo,
zum Thema Verzeichnisse auslesen hatte ich schon einmal einen Thread geschrieben, allerdings in C. Naja auf jeden Fall treten damit Probleme auf.
Hier erst einmal der Codestruct DirContent { std::string parent; std::vector< std::string > dir; std::vector< std::string > file; }; bool getDirectoryContent( DirContent &dc, std::string root ) { //Variablen anlegen WIN32_FIND_DATA dir; HANDLE fHandle; std::string directory; struct stat entrystat; //Die übergebene Struktur leeren dc.parent = root; dc.file.clear(); dc.dir.clear(); //Im Pfadnamen sagen, dass alle Dateien mit jeder Endung ausgelesen werden sollen. directory = root + "\\*.*"; //Das Verzeichnis öffnen fHandle = FindFirstFile( directory.c_str(), &dir ); //Konnte das Verzeichnis geöffnet werden? if( fHandle == INVALID_HANDLE_VALUE ) { return false; } //Das Verzeichnis auslesen do { //Ist in dir eine Datei oder ein Unterordner? if ( stat( dir.cFileName, &entrystat ) ) { allegro_message( "Fehler beim lesen von '%s': %s", dir.cFileName, strerror(errno) ); continue; } if ( S_ISREG( entrystat.st_mode ) ) { //Datei dc.file.push_back( dir.cFileName ); } else if ( S_ISDIR( entrystat.st_mode ) ) { //Verzeichnis dc.dir.push_back( dir.cFileName ); } } while( FindNextFile( fHandle, &dir ) ); //Das Verzeichnis wieder schliessen FindClose( fHandle ); return true; } /* AUFRUF: DirContent dc; getDirectoryContent( dc, "C:" ); //Funktioniert nicht! getDirectoryContent( dc, "." ); //Funkioniert! */
Mit diesem Code will ich nun ein Verzeichnis auslesen und nach Dateien und Unterverzeichnisse trennen. Das Auslesen klappt bei allen Verzeichnissen, die ich Angebe. Nur wenn ich nun zwischen Datei und Verzeichnis unterscheiden will( stat() usw. ), dann kann ich das Verzeichnis auslesen, in dem die EXE ist, aber kein anderes Verzeichnis. Jedesmal sagt mit die Ausgabe( allegro_message() ):
Fehler beim lesen von '[...]': No such file or directory
Wieso kann er keine Verzeichnisse außer "." auslesen?
Ich hoffe, ich hab mich verständlich ausgedrückt.
P.S: Ich habe bewusst auf Frameworks/Bibliotheken wie z.B. Boost verzichtet. Solche Vorschläge möchte ich also nicht lesen
MfG. Christoph Ludwig
-
ChristophLu schrieb:
Ich hoffe, ich hab mich verständlich ausgedrückt.
P.S: Ich habe bewusst auf Frameworks/Bibliotheken wie z.B. Boost verzichtet. Solche Vorschläge möchte ich also nicht lesen
MfG. Christoph LudwigDann wäre es vielleicht nicht ganz abwegig, im entsprechenden Unterforum, in deinem Falle WinAPI, nachzufragen. Hier geht es nämlich um Standard-C++ (und Quasi-Standard-Boost).
-
Du gibst hier:
if ( stat( dir.cFileName, &entrystat ) )
den Pfad nicht an, sondern nur den reinen Dateinamen.
Ich frage mich allerdings, warum du nicht
dir
verwendest.WIN32_FIND_DATA
liefert dir alle Attribute, die du brauchst:if(dir.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // Verzeichnis } else { // Datei }
Stefan.