Ordnergröße mithilfe von stat und st_size ermitteln



  • Hallo,
    Ich hab mich schon schlau gemacht und hab das in diesem Forum gefunden, Jedoch funktioniert das nicht, wenn man die größe eines Ordners herausfinden will. Es funktioniert nur, wenn das Ziel eine Dateiendung hat, also .zip, usw.
    Nun zur Frage: Wüsste jemand von euch wie man das hinbekommt? 🙂

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    
    int main (int argc, char *argv[])
    {
      struct stat status;
      off_t size_total = 0;
    
      for (argv+=!!(argc-1); *argv; ++argv) {
        if (stat (*argv, &status) == -1) {
          perror("Fehler bei stat");
          return EXIT_FAILURE;
        }
        printf ("Größe von %s: %ld Bytes\n", *argv, status.st_size);
        size_total += status.st_size;
      }
      if (argc > 1)
        printf ("Größe aller angegebenen Dateien: %ld Bytes = %ld KiB\n",
            size_total, size_total/1024);
      return EXIT_SUCCESS;
    }
    


  • 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.


  • Mod

    Das hat nichts mit Dateiendungen zu tun. Dateiendungen sind ein Windowskonzept. Das geht um Dateien und Ordner. Du hast einfach eine falsche Vorstellung davon, was stat tut. Es zählt nicht Dateien im Ordner, sondern gibt Informationen über den Ordner selbst. Und dessen Größe ist in der Regel 4 kB (bei üblichen Dateisystemen).

    Analogie für C-Programmierer:

    int *foo = malloc(100);
    sizof(foo);  // Größe des Pointers, nicht 100.
    


  • Ich will auch keine Dateien zählen, ich will einfach nur die größe des Ordners herausfinden, und leider klappt es mit diesem Programm nicht. Es funktioniert nur nicht bei Ordner, sonst klappt es.



  • Was ist "Die Größe eines Ordners"?


  • Mod

    halotolos schrieb:

    Ich will auch keine Dateien zählen, ich will einfach nur die größe des Ordners herausfinden, und leider klappt es mit diesem Programm nicht. Es funktioniert nur nicht bei Ordner, sonst klappt es.

    Dann mach eine ausführliche Fehlerbeschreibung, denn bei mir passiert genau das, was ich erwarte. Für Dateien die Größe und für Ordner eben auch. Bloß ist die Ordnergröße eben 4kB, was für den Laien vielleicht etwas unerwartet ist aber genau das was sie sein sollte.

    Also:
    Was tust du?
    Was erwartest du?
    Was passiert stattdessen?



  • Ich hab den Code so umgeschrieben, dass man per Pfad bestimmen kann, was man will:

    #include <stdio.h>
    #include <sys\stat.h>
    #include <windows.h>
    
    int main(int argc, char *argv[])
    	{
    		char hallo[] = "C:\\Users\\MeinNam\\Desktop\\test";
    		struct stat status;
    		off_t size_total = 0;
    
    		for (argv+=!!(argc-1); *argv; ++argv) {
    		if (stat (hallo, &status) == -1) {
    			perror("Fehler bei stat");
    			return EXIT_FAILURE;
    		}
    		printf ("Größe von %s: %ld Bytes\n", hallo, status.st_size);
    		size_total += status.st_size;
    		}
    		if (argc > 1)
    		printf ("Größe aller angegebenen Dateien: %ld Bytes = %ld KiB\n",
    			size_total, size_total/1024);
    
    		return 0;
    	}
    

    Soweit so gut.
    Ich kompiliere das Programm, geht auch alles. Wenn ich es dann ausführe, dann steht: "0 Bytes" obwohl ich etwas drinnen habe was ca. 10MB sind.
    Ich erwarte mir, dass ich die größe des Ordners erfahre.

    Hoffe du verstehst mein Problem jetzt 🙂


  • Mod

    halotolos schrieb:

    Soweit so gut.
    Ich kompiliere das Programm, geht auch alles. Wenn ich es dann ausführe, dann steht: "0 Bytes" obwohl ich etwas drinnen habe was ca. 10MB sind.
    Ich erwarte mir, dass ich die größe des Ordners erfahre.

    Hoffe du verstehst mein Problem jetzt 🙂

    Dann habe ich dich schon gleich zu Anfang verstanden und deine Frage beantwortet:

    SeppJ schrieb:

    Du hast einfach eine falsche Vorstellung davon, was stat tut. Es zählt nicht Dateien im Ordner, sondern gibt Informationen über den Ordner selbst. Und dessen Größe ist in der Regel 4 kB (bei üblichen Dateisystemen).

    Analogie für C-Programmierer:

    int *foo = malloc(100);
    sizof(foo);  // Größe des Pointers, nicht 100.
    

    Warum antwortest du auf diese Erklärung

    halotolos schrieb:

    Ich will auch keine Dateien zählen,

    😕

    P.S.: Auf Windows ist die Größe eines Ordners anscheinend 0, aber das ändert auch nichts an der Erklärung.



  • Na, da hab ich micht verschrieben.

    Aber ich versteh nicht, wie mir deine Lösung eine Hilfe sein kann.



  • Du wirst wohl die Größe aller enthaltenen Dateien rekursiv bestimmen und addieren müssen.



  • Aber genau das ist ja das Problem. Ich weiß nicht wie die Dateien heißen.
    Ich habe bereits ein Programm geschrieben, mit dem ich den Inhalt eines Ordners kopieren kann. Mit der Funktion access() kann man nur überprüfen ob ein Ordner existiert, aber nicht ob etwas im Ordner ist. Deshalb möchte ich die größe des Ordners herausfinden und somit bestimmen, ob es kopiert und ein neuer Ordner erstellt werden soll, in dem die Dateien hineinkommen.
    Wenn es jedoch noch eine andere Möglichkeit gibt das so zu regeln wäre wirklich hilfreich 🙂


  • Mod

    dirent.h



  • Hat leider nichts gebracht.



  • halotolos schrieb:

    Hat leider nichts gebracht.

    Hast du die Funktionen aus dirent.h schon früher mal ausprobiert, so dass du in 3 Minuten zu dieser Erkenntnis kommst?



  • DirkB schrieb:

    halotolos schrieb:

    Hat leider nichts gebracht.

    Hast du die Funktionen aus dirent.h schon früher mal ausprobiert, so dass du in 3 Minuten zu dieser Erkenntnis kommst?

    Nein, ich hab sie einfach eingebunden. Ich dachte da er nichts dazu geschrieben hat, muss ich sie einfach einbinden und es geht.



  • halotolos schrieb:

    Nein, ich hab sie einfach eingebunden. Ich dachte da er nichts dazu geschrieben hat, muss ich sie einfach einbinden und es geht.

    🙄
    Dann lies dir die man-Page / Dokumentation zu dirent durch.



  • DirkB schrieb:

    🙄
    Dann lies dir die man-Page / Dokumentation zu dirent durch.

    Das ist zur Verzeichnisverwaltung nötig, aber was hilft mir das mit meinem Problem? Ich möchte nur die größe eines Ordners herausfinden, mehr nicht.



  • halotolos schrieb:

    Das ist zur Verzeichnisverwaltung nötig, aber was hilft mir das mit meinem Problem? Ich möchte nur die größe eines Ordners herausfinden, mehr nicht.

    Bashar schrieb:

    Du wirst wohl die Größe aller enthaltenen Dateien rekursiv bestimmen und addieren müssen.



  • halotolos schrieb:

    Das ist zur Verzeichnisverwaltung nötig, aber was hilft mir das mit meinem Problem? Ich möchte nur die größe eines Ordners herausfinden, mehr nicht.

    Dein Problem ist, herauszufinden, ob sich in dem Ordner Dateien befinden, oder nicht? Hast du jedenfalls oben gesagt.

    Abgesehen davon: Ich hatte dir den Tipp gegeben, alle Dateien in dem Ordner zu durchlaufen und ihre Größen zu addieren, daraufhin du:

    Ich weiß nicht wie die Dateien heißen.

    Jetzt liefert dir jemand eine Möglichkeit, die Namen dieser Dateien zu ermitteln, und es ist dir auch wieder nicht recht. 😕



  • Achso.. Jetzt hab ich den Sinn verstanden.
    Vielen Dank für eure große Hilfe und Geduld. 🙂


Log in to reply