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 Code

    struct 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 Ludwig

    Dann 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.


Log in to reply