eigene "dir"-Funktion: st_size stimmt nicht
-
Hi,
bin gerade dabei eine abgeschwächte Version der "dir" Funktion von Linux in C zu schreiben. Das Auflisten der Dateien funktioniert soweit ganz gut. Nun soll noch die Dateigröße angegeben werden. Das funktioniert beim ersten Ordner auch noch ganz gut. Dann wird aber stets 4096 Bytes für alle Dateien angezeigt. Ich habe das mit "dir" überprüft. Die sind nicht alle 4096 Bytes groß.
Wo liegt der Fehler?#include <stdlib.h> #include <sys/types.h> #include <dirent.h> #include <string.h> #include <limits.h> #include <sys/stat.h> void read(char *); int main(int argc, char **argv) { read("."); read("../aufgabe5"); read("../aufgabe2"); return EXIT_SUCCESS; } void read(char *folder){ DIR *directory; directory = opendir(folder); struct dirent * entry; struct stat buf; if (directory != NULL) { while ((entry = readdir(directory)) !=NULL) { char pth[PATH_MAX]; strcpy(pth, entry->d_name); stat(pth, &buf); if(strchr(pth, '.')-pth+1 !=1) { printf("%llu\t%s\n", (unsigned long long) buf.st_size, pth); } } closedir(directory); printf("\n"); } else { fprintf(stderr, "%s: No such file or directory\n", folder); } }
-
Fehlerdiagnose, Schritt 1: Rückgabewerte prüfen.
-
Meinst du damit den Rückgabewert der stat-Funktion?
Diese liefert 0, wenn alles passt und bei einem Fehler -1.
Wenn nun -1 zurück gegeben wird. Was soll dann passieren?
-
errno auswerten.
P.S.: Erklär mal deine Zeile 26 und wie stat damit die Datei finden soll.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
SeppJ schrieb:
errno auswerten.
Okay! Dann versuche ich das mal
SeppJ schrieb:
P.S.: Erklär mal deine Zeile 26 und wie stat damit die Datei finden soll.
In Zeile 26 möchte ich entry->d_name in einem char-Array speichern, damit ich in Zukunft einfach immer per pth darauf zugreifen kann. Das scheint wohl nicht so OK zu sein?
Bis dahin schon mal vielen Dank für die Hilfe!
-
lerneLebenslang schrieb:
P.S.: Erklär mal deine Zeile 26 und wie stat damit die Datei finden soll.
In Zeile 26 möchte ich entry->d_name in einem char-Array speichern, damit ich in Zukunft einfach immer per pth darauf zugreifen kann. Das scheint wohl nicht so OK zu sein?
Du erreichst damit schon das, was du beschreibst, aber was steht denn in entry->d_name? anscheinend nicht das, was du denkst. In Zeile 30 gibst du es aus. Fällt dir daran nicht auf? Würdest du stat von der Kommandozeile aufrufen, wäre das denn richtig mit diesem
pth
?
-
SeppJ schrieb:
Du erreichst damit schon das, was du beschreibst, aber was steht denn in entry->d_name? anscheinend nicht das, was du denkst. In Zeile 30 gibst du es aus. Fällt dir daran nicht auf?
Oje, die Fragezeichen werden bei mir immer größer.
Also laut http://www.delorie.com/gnu/docs/glibc/libc_270.html ist doch in der struct dirent unter d_name der Datei-/Ordnername abgespeichert. Und genau den möchte ich doch haben.Und jetzt zu dem errno. Ich bin mir nicht sicher, ob ich das Vorgehen bis jetzt verstanden habe.
Mit dem nun folgenden Code bricht das Programm irgendwann mit der Meldung "Something went wrong: No such file or directory" ab.
Der Ordner "aufgabe2" wird gar nicht mehr durchsucht.#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <dirent.h> #include <string.h> #include <limits.h> #include <sys/stat.h> #include <errno.h> void read(char *); int main(int argc, char **argv) { read("."); read("../aufgabe5"); read("../aufgabe2"); return EXIT_SUCCESS; } void read(char *folder){ DIR *directory; directory = opendir(folder); struct dirent * entry; struct stat buf; if (directory != NULL) { errno = 0; while ((entry = readdir(directory)) !=NULL) { char pth[PATH_MAX]; strcpy(pth, entry->d_name); stat(pth, &buf); if(strchr(pth, '.')-pth+1 !=1) { printf("%llu\t%s\n", (unsigned long long) buf.st_size, pth); } } if (errno != 0){ fprintf(stderr, "Dafuq! Something went wrong: %s\n", strerror(errno)); exit(EXIT_FAILURE); } closedir(directory); printf("\n"); } else { fprintf(stderr, "%s: No such file or directory\n", folder); } }
-
lerneLebenslang schrieb:
SeppJ schrieb:
Du erreichst damit schon das, was du beschreibst, aber was steht denn in entry->d_name? anscheinend nicht das, was du denkst. In Zeile 30 gibst du es aus. Fällt dir daran nicht auf?
Oje, die Fragezeichen werden bei mir immer größer.
Also laut http://www.delorie.com/gnu/docs/glibc/libc_270.html ist doch in der struct dirent unter d_name der Datei-/Ordnername abgespeichert. Und genau den möchte ich doch haben.Nope:
This is the null-terminated file name component.
Nur der Dateiname. *wink wink*
Und jetzt zu dem errno. Ich bin mir nicht sicher, ob ich das Vorgehen bis jetzt verstanden habe.
Nein, errno geht ganz anders. errno ist eine globale Variable. Stellst du fest, dass eine Funktion einen Fehler verursacht hat (Rückgabewert), dann kannst du dir den Wert in errno angucken, was genau der Fehler war. Das hat die Funktion im Fehlerfall da rein geschrieben. so kannst du zum Beispiel unterscheiden, ob stat fehlgeschlagen ist, weil die Datei nicht gefunden wurde oder weil die Festplatte explodiert ist.
errno wird nicht automatisch zurück gesetzt (also auf 0 gesetzt). Wenn du mehrere Funktionen aufrufst, die errno verändern können, dann musst du aufpassen, welche davon errno verändert hat.