Fragen zu stat und st_size
-
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)
-
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?
-
Tim schrieb:
Kurze Recherche ergab http://openbook.galileocomputing.de/c_von_a_bis_z/017_c_dateien_verzeichnisse_001.htm#t2t33
Himmel hilf!
-
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?
-
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.