![]() |
Dateien > 4 GB
Hallo zusammen!
Ich benutze Delphi 6 und habe neulich ein Prigramm geschrieben, was mit recht großen Dateien werkeln soll (hier: DVD Image Dateien). Das Programm lief recht flott und gut mit meinen Test-Dateien, aber ich musste feststellen, dass ab Dateigrößen von 4 GB der "Ofen aus" ist. So liefert FileSize() die Dateigröße MOD 4 GB, Funktionen wie BlockRead() reagieren ähnlich. Also kurz: Katastrophe! Würden sie doch einfach einen Fehler melden.... nein. Hat jemand Erfahrungen und Lösungsmöglichkeiten? Ich verstehe ja, dass in den üblichen 32bit-Variablen nur Werte bis "4 GB" darstellen lassen und dass ab dann das ganze System zerfällt. Aber gibt es Möglichkeiten das zu umgehen und... sogar wichtiger... ist möglicherweise eine neuere Delphi-Version entsprechend angepasst worden? Zum Glück hat sich der eigentliche Anlass das Programm zu schreiben erledigt. Drum brauche ich es nicht mehr, aber nun nagt es an meinem Gewissen und ich würde das sehr gerne trotzdem hinbekommen. :-) Tschüß Marcus |
Re: Dateien > 4 GB
Das hat mit Delphi nichts zu tun. Das zugrundeliegende Dateisystem gibt nicht mehr her. Bei 2^32-1 ist eben Schluss zu mindest bei NTFS unter Windows. Bei Fat32 ist schon bei 2 GB Schluss.
|
Re: Dateien > 4 GB
Zitat:
Es steht geschrieben: FAT
FAT32
NTFS
Ergo: Auf NTFS ist die Dateigröße unbegrenzt. Marcus benutzt FAT32 (mit maximaler Dateigröße 4 GiB). ![]() |
Re: Dateien > 4 GB
Ups. Peinlich. Dann hab eich mich geirrt. :gruebel:
|
Re: Dateien > 4 GB
Häh? Wie jetzt?
FAT32 auf Windows 2000/XP bis 4GB Und Größe einzelner Dateien auf NTFS ist quasi unbegrenzt. Schonmal Gedanken gemacht, warum die APIs für Dateioffsets 2 (lies: ZWEI) DWORDs, also quasi ein QWORD (aka LARGE_INTEGER) benutzen? Beispiele:
Code:
DWORD GetFileSize(
HANDLE hFile, LPDWORD lpFileSizeHigh // <-- hier ); DWORD GetCompressedFileSize( LPCTSTR lpFileName, LPDWORD lpFileSizeHigh // <-- hier ); DWORD SetFilePointer( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, // <-- hier DWORD dwMoveMethod ); typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; // <-- hier DWORD Offset; DWORD OffsetHigh; // <-- hier HANDLE hEvent; } OVERLAPPED; ![]() (Suche nach "NTFS compared to FAT and FAT32" in der KB) ![]() ![]() |
Re: Dateien > 4 GB
Zitat:
Sorry ich bin Pedant :zwinker: :mrgreen: Zitat:
Vielleicht solltest du dir bei diesen Dateigrößen auch eigene Wrapperfunktionen um WriteFile() usw. schreiben, damit du statt BlockWrite() lieber Systemfunktionen benutzt. |
Re: Dateien > 4 GB
Benutz einfach TFileStream da solltest du das Problem nicht mehr haben (wird für filesize etc. INT64 genutzt)
|
Re: Dateien > 4 GB
Zitat:
|
Re: Dateien > 4 GB
Moin!
Zitat:
MfG Muetze1 |
Re: Dateien > 4 GB
Hallo,
danke für Eure Hilfe! Mit den Tips werde ich mich mal versuchen durchzuwurschteln. Mit Streams habe ich mich bislang nicht beschäftigt. Achso: natürlich benutze ich NTFS, sonst hätte ich die Datei ja nicht auf die Platte bekommen, gell. ;-) Tschau Marcus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz