Dateigröße auslesen mit lstat
-
Hallo,
ich soll für die Lehrveranstaltung "Betriebssysteme" ein C/C++-Programm implementieren, dass rekursiv alle Unterverzeichnisse eines beim Programmstart eingegebenen Verzeichnisses durchsucht und dabei die Gesamt größe der gefundenen Dateienzurückgibt. Leider findet meine Implementierung genau gar nichts, wo S_ISREG True zurückgibt.
Man möge mir etwagige Anfängerfehler verzeihen, ich hatte bisher nur ein Semester imperatives Herumgeklimper in C und stehe daher noch sehr am Anfang.
#include<stdio.h> #include<signal.h> #include <unistd.h> #include<fcntl.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> long int verzeichnisse(char argv[], int i) { DIR *dir; char newpath[1000]; struct dirent *dirzeiger; struct stat attribut; long int groesse = 0; if ((dir=opendir(argv)) != NULL) while ((dirzeiger = readdir(dir)) != NULL) { lstat(dirzeiger->d_name, &attribut); if (( strcmp(dirzeiger->d_name, ".") == 0) || strcmp(dirzeiger->d_name, "..") == 0) continue; if( S_ISREG(attribut.st_mode) ) groesse += (attribut.st_size); if( S_ISDIR(attribut.st_mode) ) { strcat(newpath, "/"); strcat(newpath, dirzeiger->d_name); i = strlen(dirzeiger->d_name)+1; groesse += verzeichnisse(newpath, i); for (; i < 100; i++) newpath[i] = 0; } } closedir(dir); return groesse; } int main(int argc, char *argv[]) { verzeichnisse(argv[1], 0); printf("Groesse in Bytes: %ld\n", verzeichnisse(argv[1], 0)); return 0; }
-
In d_name steht nur der Dateiname. Der komplette Pfad für lstat muss also aus argv und d_name zusammengesetzt werden. Wie es für den rekursiven Aufruf ja schon versucht wird. Wenn auch nicht richtig.
snprintf(newpath, 1000, "%s/%s", argv, dirzeiger->d_name);
-
Danke, ich habe die Verarbeitrung des Verzeichnisnamen abgeändert, bekomme aber dennoch nur 0 Byte zurück.
#include<stdio.h> #include<signal.h> #include <unistd.h> #include<fcntl.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> long int verzeichnisse(char argv[]) { DIR *dir; char newpath[1000]; struct dirent *dirzeiger; struct stat attribut; long int groesse = 0; if ((dir=opendir(argv)) != NULL) while ((dirzeiger = readdir(dir)) != NULL) { lstat(dirzeiger->d_name, &attribut); if (( strcmp(dirzeiger->d_name, ".") == 0) || strcmp(dirzeiger->d_name, "..") == 0) continue; if( S_ISREG(attribut.st_mode) ) groesse += (attribut.st_size); if( S_ISDIR(attribut.st_mode) ) { snprintf(newpath, 1000, "%s/%s", argv, dirzeiger->d_name); groesse += verzeichnisse(newpath); } } closedir(dir); return groesse; } int main(int argc, char *argv[]) { verzeichnisse(argv[1]); printf("Groesse in Bytes: %ld\n", verzeichnisse(argv[1])); return 0; }
-
Setzte Zeile 30 vor Zeile 23 und benutz newpath beim lstat-Aufruf.
Im übrigen wäre es sinnvoll die Rückgabewerte zu prüfen (lstat). Und das closedir macht nur nach einem erfolgreichen opendir Sinn. (Klammern)