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!


Anmelden zum Antworten