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)


Anmelden zum Antworten