Verzeichnis durchlaugen



  • Guten Abend!

    Entgegen der meisten C++-Programmierer die ich kennengelernt habe denke ich nicht, dass C eine veraltete Sprache ist, mit der man "nichts machen kann". Ganz im Gegenteil konnte ich mich nie mit C++ anfreunden - wollte dies aber heute endlich einmal wagen.

    Allerdings bin ich heute auf mein erstes Problem gestoßen, nämlich das rekursive Durchlaufen einer Verzeichnisstruktur. In reinem C ist würde ich das - mal grob runtergetippt - so machen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <string.h>
    
    void show_files (const char *dirname) {
    	DIR *dir;
    	struct dirent *dir_info;
    	char filename[5120];
    	struct stat attr;
    
    	if ((dir = opendir (dirname)) != NULL) {
    		while ((dir_info = readdir (dir)) != NULL) {
    			if (strcmp (dir_info->d_name, ".") != 0 && strcmp (dir_info->d_name, "..") != 0) {
    				if (dirname[strlen (dirname) - 1] == '/') {
    					sprintf (filename, "%s%s", dirname, dir_info->d_name);
    				}
    				else {
    					sprintf (filename, "%s/%s", dirname, dir_info->d_name);
    				}
    
    				if (stat (filename, &attr) == 0) {
    					fprintf (stdout, "%s\n", filename);
    					switch (attr.st_mode & S_IFMT) {
    						case S_IFDIR:
    							show_files (filename);
    							break;
    						default:
    							fprintf (stdout, "%s\n", filename);
    					}
    				}
    				else {
    					fprintf (stderr, "Could not stat file: %s\n", dir_info->d_name);
    				}
    			}
    		}		
    		closedir (dir);
    	}
    	else {
    		fprintf (stderr, "Could not open dir: %s\n", dirname);
    	}
    }
    
    int main (int argc, char *argv[]) {
    	show_files ("/home");
    
    	return EXIT_SUCCESS;
    }
    

    Da es mir aber rein subjektiv ziemlich dreckig vorkommen würde, C und C++ zu mischen, suche ich nun eine Lösung in reinem C++. Müsste doch eigentlich gehen, oder?

    Mfg, Lord Kefir



  • Hast du denn mal die API angeguckt? Mir schebt da Findfirstfile und Findnextfile vor Augen.



  • Naja wenn du es wirklich in "reinem C++" machen willst musst du dazu erstmal entweder die Funktionen wrappen oder eine Lib wie Boost nehmen.



  • Gut wollte ich nur wissen - also implementiere ich den Kram in C. Schade, finde ich irgendwie dreckig.

    @the_hero99: Was für eine API? Ich habe die Frage extra ins allgemeine Forum gestellt, da es relativ plattforumunabhängig sein soll (geht in C ja schließlich auch mit einigen wenigen Einschränkungen).

    Mfg, Lord Kefir



  • die boost lib und das ist dann immernoch sehr plattformunabhängig da boost ja auch nicht nur für eine platform kompiliert werden kann



  • Nochmal schönen Dank für Tipps. Ich mache das jetzt erst mal mit der Win-API.

    Mfg, Lord Kefir



  • Jo super, und den Code oben hast du ja sicher auch wie von dir beschrieben "kurz runtergetippt" - und nun greifst du zur WinAPI. 👎 👎



  • @Thomas (:
    Frag' mich nicht warum, aber ich gehe trotzdem mal kurz auf diesen pubertären Beitrag ein:
    Das Programm an dem ich arbeite ist für Windows. Und da MS eh auf jegliche Standards pfeift ist es völlig legim - aber nicht sehr schön -, auf die Windows-API zurückzugreifen. Wofür eine Library wie Boost installieren oder sonst irgendeinen Aufwand betreiben, wenn ich den Kram mal eben so mit FindFirstFile etc. implementieren kann?!
    Ich wollte nur wissen ob es mit einer ach so tollen und ausgereiften Sprache wie C++ möglich ist, ein Verzeichnis zu durchlaufen.

    Mfg, Lord Kefir



  • Lord Kefir schrieb:

    Ich wollte nur wissen ob es mit einer ach so tollen und ausgereiften Sprache wie C++ möglich ist, ein Verzeichnis zu durchlaufen.

    Mit "reinem C++" genausowenig wie mit "reinem C".



  • Sagen wir es mal so: der von mir gepostete Code läuft auf ziemlich vielen Betriebssystemen. Wenn man noch ein paar Präprozessordirektiven reinpackt und einen mehr oder minder POSIX-konformen Compiler nutzt sogar unter Windows.

    Mfg, Lord Kefir

    [edit]
    Krass, unter Dev-C++ kannst Du den Code sogar so wie er ist einfügen und ausführen.
    [/edit]



  • Sagen wir mal so: Benutz boost::filesystem, welches auch auf "ziemlich vielen" Betriebssystemen läuft, auch unter Windows.



  • Warum haben jetzt eigentlich einige ein Problem damit, wenn ich für ein Windowsprogramm die Windows-API benutze?

    Mfg, Lord Kefir


Log in to reply