Fragen zu stat und st_size



  • Kann es sein, dass du nicht eins zu eins den Code kopiert hast? Kurze Recherche ergab http://openbook.galileocomputing.de/c_von_a_bis_z/017_c_dateien_verzeichnisse_001.htm#t2t33 und da wird wie erwartet auch stat() aufgerufen welches die Struktur füllt.



  • Ich häng dann meine Frage gleich mal hier mit ran:

    Was mache ich, wenn meine Datei ziemich groß ist (also ich mein so 4GB aufwärts)? Da erreiche ich doch die Grenze jeden Datentyps oder?



  • Dann nimmst du einfach stat64. (ab 2GB, laut Link, Erklärung im 2. Link)

    http://www.mkssoftware.com/docs/man5/struct_stat.5.asp

    http://www.cplusplus.com/forum/beginner/18238/



  • Das bekommst du plattformunabhängig nicht mehr hin, du musst zu Compiler/Bibliotheksspezifischem greifen.
    Für MSVC > 6.0 gibt es z.B. _stati64, dann müsstest du auch mit _int64 bzw. long long Integertypen weitermachen.



  • Danke schonmal. Jetzt hab ich leider folgende Fehlermeldung:

    storage size of 'attribut' isn't known|
    

    Benutze Code::Blocks und hab folgendes eingebunden:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    

    Und was genau passiert dabei auf 32bit Systemen? Einwandfrei kompatibel?





  • Vorherigen Fehler behoben. Bei GCC heißt die Funktion "_stati64". Die richtige Dateigröße zeigt er mir bei großen dateien immernoch nicht an.

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int main()
    {
        FILE *datei;
    
        datei=fopen("Pfad", "r"); //ja, für Pfad hab ich einen wirklichen Pfad angegeben
    
        struct _stati64 attribut;
        _stati64("Pfad",&attribut);
        unsigned long long groesse=0;
        groesse = attribut.st_size;
        printf("groesse: %llu", groesse);
    }
    


  • #ifdef __unix__
          #include <sys/stat.h>
    #else
          #include <sys\stat.h>
    #endif
    

    Dieses C von A bis Z ist doch immer wieder für einen Lacher gut.

    Aus

    /* size.c - Originalversion */
    #include <stdio.h>
    #include <stdlib.h>
    #ifdef __unix__
          #include <sys/stat.h>
          #include <sys/types.h>
    #else
          #include <sys\stat.h>
    #endif
    
    int main(int argc, char *argv[]) {
       struct stat attribut; // Schöne Eindeutschung (engl.: attribute)
       unsigned long sizeofall=0;
    
       if(argc == 1) {
          if(stat(*argv, &attribut) == -1) {
             fprintf(stderr,"Fehler bei stat....\n"); // Weiss der, dass perror den echten Grund anzeigt?
             return EXIT_FAILURE;
          }
          else {
             printf("Größe von %s = %ld Bytes\n",
                *argv,attribut.st_size);
             return EXIT_SUCCESS;
          }
       }
       else {
          while(*++argv) { // hier folgt Codeverdopplung
             if(stat(*argv, &attribut) == -1) {
                fprintf(stderr,"Fehler bei stat....\n");
                return EXIT_FAILURE;
             }
             else {
                printf("Größe von %s = %ld Bytes\n",
                   *argv,attribut.st_size);
                sizeofall += attribut.st_size;
             }
          }
       }
       printf("Größe aller Dateien in der "
              " Kommandozeile = %ld Bytes",sizeofall); // Grösse aller Dateien in der Kommandozeile?!?
       printf("= %ld KB\n",sizeofall/=1024); // hihi: sizeofall/=1024
       return EXIT_SUCCESS;
    }
    

    mach

    /* size.c - Verbesserte Version */
    #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;
    }
    

    Ergibt zwar gleiche Funktionalität, aber die Sache mit argv[0] hat unser Jürgen Wolf noch nicht ganz verstanden.



  • Danke! Läuft jetzt alles soweit.



  • Das funktionier ja alles super 🙂
    Jedoch habe ich das Problem, dass wenn ich es mit einem Verzeichnis probiere nicht klappt. "& S_IFDIR" anzuhängen bringt auch nichts. Hätte da noch jemand eine Idee? 🙂


  • Mod

    halotolos schrieb:

    Hätte da noch jemand eine Idee? 🙂

    Keine Threadnekromantie betreiben, richtiges Forum wählen*, genaue Fragen stellen.

    *: Ja, dieser Thread hier ist selber falsch einsortiert.


Anmelden zum Antworten