AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Dateien > 4 GB

Ein Thema von m_junglas · begonnen am 7. Apr 2005 · letzter Beitrag vom 7. Apr 2005
Antwort Antwort
m_junglas

Registriert seit: 4. Apr 2005
Ort: Kaiserslautern
13 Beiträge
 
Delphi 7 Professional
 
#1

Dateien > 4 GB

  Alt 7. Apr 2005, 01:04
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
Marcus Junglas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 01:20
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 01:35
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
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 01:37
Ups. Peinlich. Dann hab eich mich geirrt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#5

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 01:38
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
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#6

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 01:39
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 08:09
Benutz einfach TFileStream da solltest du das Problem nicht mehr haben (wird für filesize etc. INT64 genutzt)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#8

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 09:07
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).
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 09:45
Moin!

Zitat von Mephistopheles:
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
  Mit Zitat antworten Zitat
m_junglas

Registriert seit: 4. Apr 2005
Ort: Kaiserslautern
13 Beiträge
 
Delphi 7 Professional
 
#10

Re: Dateien > 4 GB

  Alt 7. Apr 2005, 17:06
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
Marcus Junglas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf