Kadaj Geschrieben 27. Oktober 2011 Teilen Geschrieben 27. Oktober 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 27. Oktober 2011 Teilen Geschrieben 27. Oktober 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 27. Oktober 2011 Autor Teilen Geschrieben 27. Oktober 2011 Ja, das ist schon möglich, aber ich muss die Aufgabe unter C lösen;) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 28. Oktober 2011 Autor Teilen Geschrieben 28. Oktober 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 4. November 2011 Autor Teilen Geschrieben 4. November 2011 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 30. November 2011 Autor Teilen Geschrieben 30. November 2011 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.