Veröffentlicht 27. Oktober 201113 j Hallo, ich versuche grade mir von einem Programm nur alle regulären Dateien auflisten zu lassen. Das funktioniert auch unter debian mit d_type: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <unistd.h> int i = 0; int lang = 0; int main(int zahl, char *para[1]) { DIR *verzeichnis; struct dirent *eintrag; verzeichnis = opendir(para[1]); struct stat sb; if(zahl != 2) //wurde genau 1 parameter übergeben? { printf("Fehler bei der Parameteruebergabe.\n"); printf("Es muss genau ein Parameter uebergeben werden!\n"); printf("Die Syntax lautet: `./parameter /ordner/ordner/.../ordner`\n"); return 0; } while((eintrag = readdir(verzeichnis)) != NULL) { if(eintrag->d_type == 8) // geht nicht unter suse { printf("%s\t", eintrag->d_name); i++; lang = lang + strlen(eintrag->d_name); printf("Rueckgabe: %d ",eintrag->d_type); printf("Laenge: %d \n",lang); } } printf("\n%d Einträge gefunden\n",i); return 0; } [/PHP] aber, wie schon im Kommentar angemerkt, gibt es "d_type" nicht auf allen Distributionen und in der Aufagabe stand ohnehin, dass lstat() verwendet werden soll. Wenn ich aber die man-page aufrufe: [CODE]man lstat[/CODE] dann bekomme ich nur die Struktur von stat() und in stat() selbst gibt es keinen Eintrag, den ich verwenden kann um herauszufinden, ob es eine reguläre Datei ist. Was mich auch verwirrt ist, dass unter example "struct stat sb;" steht, denn müsste dann nicht oben unter synopsis was davon stehen? Mit int "lstat(const char *path, struct stat *buf);" kann ich auch nichts anfangen, ich hab schon einiges ausprobiert, werde aber einfach nicht schlauer aus der Funktion, weiß jemand wie ich lstat bei mir verwenden müsste, oder gibt es ein Beispiel, an dem man es besser nachvollziehen kann als in der man-page? Im Netz hab ich auch nichts anschauliches gefunden. Danke im Voraus.
27. Oktober 201113 j Ich werfe einmal ein, wenn Du in die Richtung cross-plattform gehen willst, dass evtl C++ mit Filesystem Home durchaus das Ganze etwas bequemer macht
28. Oktober 201113 j Autor Ich merk grad, dass lstat was ganz anderes macht als das, was ich eigentlich brauche. Ich muss nur irgendwie herausfinden ob die, die readdir, eingelesene Datei eine reguläre ist, aber ohne d_type. Mal schaun, was ich dazu finde.
4. November 201113 j Autor Ich hab mich geirrt, lstat kann mit S_IFREG überprüfen ob es sich um eine reguläre Datei handelt. Nur funktioniert es noch nicht so richtig. "eintrag" verändert sich bei jedem Durchlauf der Schleife, das sieht man, da sich ja auch d_name verändert. Die erste Zeile in meiner Schleife soll ja den Namen der Datei erfassen und ihn dann an "info" weitergeben. Jedoch funktioniert lstat nur beim ersten mal, denn bei der Ausgabe erhalte ich immer wieder die Größe der ersten Datei, sollte ein neuer Aufruf von lstat nicht einen neuen Wert in "info" schreiben? Hier der Code: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <unistd.h> int i = 0; int size = 0; int main(int zahl, char *para[1]) { DIR *verzeichnis; struct dirent *eintrag; verzeichnis = opendir(para[1]); struct stat info; if(zahl != 2) { printf("Fehler bei der Parameteruebergabe.\n"); printf("Es muss genau ein Parameter uebergeben werden!\n"); printf("Die Syntax lautet: `./parameter /ordner/ordner/.../ordner`\n"); return 0; } while((eintrag = readdir(verzeichnis)) != NULL) { lstat(eintrag->d_name, &info); //lstat braucht den Name und gibt alles an info weiter if(S_ISDIR(info.st_mode)) { printf("%s\t", eintrag->d_name); i++; size = size + info.st_size; printf("Rueckgabe von d_type: %d ",eintrag->d_type); printf("size der datei: %d ",info.st_size); printf("size-gesamt: %d \n",size); } } printf("\n%d Einträge gefunden\n",i); return 0; } [/php] Wäre echt super, wenn jemand den Fehler sieht, ich hab im Netz nur Beispiele gefunden, in denen nur der übergebene Parameter überprüft wird (in meinem Fall wäre das para[1] ) aber ich möchte lstat in einer Schleife durchlaufen lassen. Hat jemand eine Idee?
30. November 201113 j Autor Das Thema hab ich ja ganz vergessen. So funktioniert es: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <unistd.h> int i = 0; int size = 0; int main(int zahl, char *para[1]) { DIR *verzeichnis; struct dirent *eintrag; verzeichnis = opendir(para[1]); struct stat info; if(zahl != 2) { printf("Fehler bei der Parameteruebergabe.\n"); printf("Es muss genau ein Parameter uebergeben werden!\n"); printf("Die Syntax lautet: `./parameter /ordner/ordner/.../ordner`\n"); return 0; } while((eintrag = readdir(verzeichnis)) != NULL) { lstat(eintrag->d_name, &info); //lstat braucht den Name und gibt alles an info weiter if(S_ISREG(info.st_mode)) { printf("%-25s", eintrag->d_name); //oder (*eintrag).d_name, () weisen an, dass erst dereferenziert werden muss i++; size = size + info.st_size; printf("Rueckgabe von d_type: %3d ",eintrag->d_type); printf("size der datei: %8d Byte ",info.st_size); printf("size-gesamt: %9d Byte\n",size); } } printf("\n%d Einträge gefunden\n",i); return 0; } [/php] Danke für die Hilfe!
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.