Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dateien > 4 GB (https://www.delphipraxis.net/43681-dateien-4-gb.html)

m_junglas 7. Apr 2005 00:04


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

Luckie 7. Apr 2005 00:20

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.

Mystic 7. Apr 2005 00:35

Re: Dateien > 4 GB
 
Zitat:

Zitat von Luckie
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.

Das ist nicht ganz korrekt!

Es steht geschrieben:
FAT
  • Volumes from floppy disk size up to 4 gigabytes (GB).
  • Does not support domains.
  • Maximum file size is 2 GB.

FAT32
  • Volumes from 512 MB to 2 TB.
  • In Windows XP, you can format a FAT32 volume up to 32 GB only.
  • Does not support domains.
  • Maximum file size is 4 GB.

NTFS
  • Recommended minimum volume size is approximately 10 megabytes (MB).
  • Volumes much larger than 2 terabytes (TB) are possible.
  • Cannot be used on floppy disks. [Geht doch, aber Microsoft erlaubt es nicht... ist sowieso eine schlechte Idee.]
  • File size limited only by size of volume.


Ergo: Auf NTFS ist die Dateigröße unbegrenzt. Marcus benutzt FAT32 (mit maximaler Dateigröße 4 GiB).

Quelle

Luckie 7. Apr 2005 00:37

Re: Dateien > 4 GB
 
Ups. Peinlich. Dann hab eich mich geirrt. :gruebel:

Mephistopheles 7. Apr 2005 00:38

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;
http://www.microsoft.com/technet/pro...0d6572fc0.mspx
(Suche nach "NTFS compared to FAT and FAT32" in der KB)

http://www.windowsitpro.com/Article/...803/38803.html
http://support.microsoft.com/default...b;en-us;184006

Mephistopheles 7. Apr 2005 00:39

Re: Dateien > 4 GB
 
Zitat:

Zitat von Mystic
Ergo: Auf NTFS ist die Dateigröße unbegrenzt. Marcus benutzt FAT32 (mit maximaler Dateigröße 4 GiB).

Quasi unbegrenzt. Bei 16TB - 64kB ist Schluß.

Sorry ich bin Pedant :zwinker: :mrgreen:

Zitat:

Zitat von m_junglas
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?

GetFileSize() mit echtem Handle ermöglich dir auch das Hi-DWORD auszulesen. Damit kannst du also quasi ULARGE_INTEGER als Dateigröße verarbeiten -> 64bit.

Vielleicht solltest du dir bei diesen Dateigrößen auch eigene Wrapperfunktionen um WriteFile() usw. schreiben, damit du statt BlockWrite() lieber Systemfunktionen benutzt.

SirThornberry 7. Apr 2005 07:09

Re: Dateien > 4 GB
 
Benutz einfach TFileStream da solltest du das Problem nicht mehr haben (wird für filesize etc. INT64 genutzt)

Mephistopheles 7. Apr 2005 08:07

Re: Dateien > 4 GB
 
Zitat:

Zitat von SirThornberry
Benutz einfach TFileStream da solltest du das Problem nicht mehr haben (wird für filesize etc. INT64 genutzt)

Und jetzt die Preisfrage: von welcher Delphiversion redest du bitte? Alle die mir zur Verfügung stehen benutzen Longint (also 32bit).

Muetze1 7. Apr 2005 08:45

Re: Dateien > 4 GB
 
Moin!

Zitat:

Zitat von Mephistopheles
Zitat:

Zitat von SirThornberry
Benutz einfach TFileStream da solltest du das Problem nicht mehr haben (wird für filesize etc. INT64 genutzt)

Und jetzt die Preisfrage: von welcher Delphiversion redest du bitte? Alle die mir zur Verfügung stehen benutzen Longint (also 32bit).

Ab Delphi 6 wurde TStream von Integer auf Int64 aufgebohrt.

MfG
Muetze1

m_junglas 7. Apr 2005 16:06

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 09:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz