Dateilänge grosser Dateien (> 5GB) in long long?
-
Hallo liebes Forum,
nun habe ich für mein Problem stundenlang nach einer Lösung gesucht, finde aber keine
Hoffentlich wisst Ihr Rat.Folgendes:
Ich moechte unter Windows XP ein Programm in C schreiben, das mir die Dateilaenge "grosser" (d.h. ab 5 GB) Dateien ausgibt; das Ganze unter Verwendung des C++ Builders, allerdings nur mit Standard-Bibliotheken. Mein C-Programm benutzt die <sys/stat.h> Bibliothek, in der die stat-Struktur einer Datei standardmäßig definiert ist. Meine "Kernfunktion" für das Auslesen der Dateilänge sieht so aus:
#include <sys/stat.h> [...] off_t getSize (char *filename) { struct stat statbuf; stat(filename, &statbuf); return statbuf.st_size } [...]Leider ist es so, daß der off_t Typ mit 4 Byte Länge festgelegt ist und folglich bei Dateien, die größer als ca. 2 GB sind, ein arithmetischer Überlauf stattfindet (z.B. negatives Ergebnis).
Nun suche ich nach einer Lösung, die Dateigröße in eine "long long"-Variable einzulesen. Ich bekomme es einfach nicht hin, denn irgendwie sind alle Rückgabe-Datentypen der Standardfunktionen auf maximal 4 Byte festgenagelt. Und unter Google war auch nichts Passendes zu finden.
Wünschenswert wäre eine Möglichkeit, die Dateilänge als "long long"-Variable direkt als Rückgabewert einer Funktion wie oben zu erhalten. Es darf ruhig etwas "konstruiert" sein, sollte aber die Standard-Bibliotheken nutzen, um portabel zu bleiben.
Für einen hilfreichen Tipp (Codebeispiel wäre super) wäre ich Euch wirklich dankbar.
Hoffentlich kann mir jemand hier helfen?!

Danke,
Flachkoepper
-
Flachkoepper schrieb:
Ich moechte unter Windows XP ein Programm in C schreiben
benutz doch WinAPI funktionen.
--> http://msdn2.microsoft.com/en-us/library/aa364957.aspx

-
Kannst ja mit dem Ueberlauf rechnen. Also wenn ein Ueberlauf bei 2^32 stattfinden, dann ist die richtige Groesse: 2^32 + ueberlaufGroesse. Muesstman halt nur wissen ob ein Ueberlauf stattgefunden hat.
-
Hallo,
wow, ich hätte nicht gedacht, dass jemand so schnell antwortet

Eine Variante mit Überlauf habe ich nun umgesetzt, um mein Programm auch unter Linux kompilieren zu koennen. Das klappt jetzt erstmal ganz gut.
Die WinAPI Funktionen habe ich mir erstmal auf meine Favouriten gelegt und werde sie zukuenftig unter Windows nutzen - Prima Sache

Ein großes Danke für Eure Tipps, Ihr habt mir damit sehr geholfen!
Viele Grüße,
Flachkoepper
-
Nun habe ich doch noch eine Frage. Unter dem o.g. Link habe ich versucht, der Windows API zu entnehmen, wie das Auslesen der Dateilaenge funktionieren soll.
Folgendes Programm habe ich dazu erstellt (aus einem Kontext genommen, daher auf das Wesentliche beschraenkt):
#include <Windows.h> #include <stdio.h> int main(int argc, char* argv[]) { /* Argument "argv[1]" = Dateiname per Parameter. */ HANDLE fd = CreateFile(argv[1], READ_CONTROL, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); LARGE_INTEGER i; GetFileSizeEx(&fd, &i); printf("lower: %lu\n", i.LowPart); /* long unsigned */ printf("Upper: %li\n", i.HighPart); /* long signed */ return EXIT_SUCCESS; }Problem: Ich erhalte, egal bei welcher Datei ich angebe, bei der printf-Ausgabe stets als "LowPart" eine 1, und als "HighPart" eine 256

Habe ich da jetzt etwas falsch verstanden?! Wo ist der Fehler, oder was kann ich mit diesen Werten anfangen?

Für einen hilfreichen Tipp waere ich Euch super dankbar!
Flachkoepper

-
GetFileSizeEx(&fd, &i);
das da raus ^^
und frag voher fd ab, darf nicht 0 oder -1 sein.

-
Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.