Auf Dateien > 2-4GB lesend / schreibend zugreifen...
-
das kann man aber einfacher herausfinden: #include<limits> ShowMessage(IntToStr(LONG_MAX ));
War mir bekannt, der Funktion traue ich aber nicht so ganz, weil ich nicht weiss, was dahinter passiert.
Über das Beispiel sehe ich eben mit recht großer wahrscheinlichkeit, welchen Wertebereich ich tatsächlich zur Verfügung habe(LONG_MAX könnte mir alles sagen, auch wenn's reell nicht so ist ;-).
Das interessante ist, dass LONG_MAX und INT_MAX meine Rechnung bestätigen *grrr*
Bringt mich derzeit also leider auch nicht ganz weiter...
TFileStream scheinen ja nicht sonderlich viele zu verwenden! Im Forum hier wird zwar immer wieder darauf hingewiesen, dass es moderner ist darüber zu arbeiten, Codebeispiele sind aber so gut wie keine vertreten. Selbst bytesandmore hatte dazu nichts im Programm.
In der Borlandhilfe sind zwar einige Methoden hinterlegt, richtig schlau welche für meinen Fall brauchbar sind wurde ich daraus jedoch nicht.*grr* allmälich verstehe ich, warum bei Software wie WinACE immer voller stolz darauf hingewiesen wird, dass "breaking the 4GB Barrier" gelungen ist
MfG
TKS[ Dieser Beitrag wurde am 09.02.2003 um 20:48 Uhr von AndreasW editiert. ]
-
Hi,
mal ein Beispiel:
void __fastcall TForm1::Button1Click(TObject *Sender) { Memo1->Lines->Clear(); TFileStream * Stream=new TFileStream( "C:\fertig.txt",fmShareDenyNone); // Größe der Datei auslesen Memo1->Lines->Add("Größe der Datei: "+IntToStr(Stream->Size)); Stream->Position=100; char* test= new char[100]; // 100 zeichen ab Byte- Position 100 lesen Stream->Read(test,100); Memo1->Lines->Add(test); delete test; delete Stream; } //---------------------------------------------------------------------------
naja, ist halt nur ein Beispiel..
TFileStream scheinen ja nicht sonderlich viele zu verwenden! Im Forum hier wird zwar immer wieder darauf hingewiesen, dass es moderner ist darüber zu arbeiten, Codebeispiele sind aber so gut wie keine vertreten. Selbst bytesandmore hatte dazu
naja, moderner vielleicht nicht. Aber bequemer. Ich würde da ansonsten sowas vorziehen.
-
Vielen dank für das Codebeispiel!
Ich habe damit mal ein DVD-ISO-Image geladen, welches ich zuvor mit dvddecrypter erstellt habe (http://www.dvddecrypter.com).
Das file ist exakt 5.856.512.000 Bytes groß, bzw. 5,45GB.FileStream liefert mir jetzt:
"Größe der Datei: -1"Gleiches Ergebnis erhalte ich über den debugger.
Somit wird TFileStream auch nicht funktionieren *grr*.
Google hat bisher auch keine brauchbaren Informationen ausgespuckt.
MfG
TKS
-
Dann benutze halt die WinAPI Funktionen. Damit gehts.
-
Original erstellt von TKSoft2000:
**Nehmen wir z.B. ftell. Nach den Dokumentationen von Borland wird long int zurückgegeben.Wenn ich nun schaue, welchen Wertebereich ich maximal in einem Long Int unter bekomme...
Also kurz überlegt und diesen kleine Code geschrieben:
unsigned int aa=999; int cur=1000000000; while (cur>=1) { while (aa>=999) aa+=cur; aa-=cur; cur/=10; } Edit1->Text=aa;
ect...
**Ein long int besitz genau wie ein int 32 bit, das "long" rührt daher das ein int früher (unter einem 16bit BS) nur 16 Bit besaß, bei einem 32 Bit BS aber eben auch 32. Ist also kein Fehler im BCB oder ähnliches... den maximalen Wert
kann man auch wesentlich eleganter bestimmen indem man einfach 2 hoch 32 in den Taschenrechner tippt (unsigned bzw signed +- 2 hoch 31). Rechnest du das aus stellst du fest das du damit 2 bzw. 4 Gb große Dateien Adressieren kannst.
Nur mal so als kurzes Zwischeninfo...
-
Somit wird TFileStream auch nicht funktionieren *grr*.
übel *G*
/me hat das nicht gewusst. Wie auch. Kein Schwein macht mit 5,4 GB- Dateien rum
dann nimm API- Funktionen, wie <Rastafari> schon sagt.
Wenns dann nicht geht, verklage Billi.
-
@Rastafari
Gib mal nen Tipp, welche du genau meinst...
Habe mich mal etwas umgeschaut, interessant waren: ReadFile Datei Größe ermitteln?
Das erste Beispiel mit
[...]HANDLE hFile = CreateFile( [...]
DWORD dwFileSize = GetFileSize(hFile, NULL);habe ich eben kurz kompiliert, die Dateigröße passte jedoch nicht (war 10-Stellig).
Das untere Beispiel sieht mir vielversprechend aus, da es anscheinend einen 64BIT Integer einführt. Testen konnte ich das Beispiel bisher jedoch noch nicht.
Wie ich das Lesen/Schreiben dann mit dem neuen Integer realisieren soll bleibt mir noch ein Rätsel, muss ich mir dann morgen mal anschauen...
Funktionieren sollte das aber über die WinAPI schon irgendwie, das OS weiss ja schließlich auch mit dem Dateisytem umzugehen.Kein Schwein macht mit 5,4 GB- Dateien rum
Ja, das machen nur verrückte Leute, die seit 1-2 Wochen im Besitz einer digitalen TV-Karte sind und nicht immer mit WinHEX oder stümperhaft programmierten Programmen die PVA-Streams vorschneiden wollen.
Wenn man da dann z.B. 6h lang MTV aufnimmt und das eigene Splitting des Aufnahme-Progs deaktiviert um das teilen zwischen den Videos zu unterbinden bekommt man ein nettes 12GB großes File
Anderes Beispiel sind die DVD-Images, die man vielleicht über mehrere 800MB CD's verteilen möchte...
Wie du siehst gibt es gibt schon genügend Möglichkeiten die heutigen 200GB Platten mit einem einzigen zusammenhängenden File voll zu bekommen, wenn man es darauf anlegt, und sich dadurch wieder etwas Programmierarbeit zu beschaffen
Wenns dann nicht geht, verklage Billi.
Gibt halt leider derzeit noch keine brauchbare Alternative zu MS *grr*
Für Linux fehlen mir noch elementar wichtige Programme wie z.B. MPEG-Encoder der hochwertige Resultate liefern kann wie CCE/TMPG.MfG
TKS
-
Das beim ersten Beispiel nicht die korrekte Dateigröße ausgegeben wird ist normal. Das zweite sollte eigentlich funktionieren. Hab mir früher mal ein 6 GB Dummy-File gemacht um die Funktion auszutesten.
-
In der MSDN ist auch folgendes Beispiel:
__int64 myFileSeek (HANDLE hf, __int64 distance, DWORD MoveMethod) { LARGE_INTEGER li; li.QuadPart = distance; li.LowPart = SetFilePointer (hf, li.LowPart, &li.HighPart, MoveMethod); if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) { li.QuadPart = -1; } return li.QuadPart; }
Du springst einfach mit dieser Funktion an die Stelle die du auslesen möchtest und rufst dann ReadFile/WriteFile auf.
-
Hi TkSoft2000,
Hi All,ich habe das Problem mit Dateien > 2 GByte auch. Unsere Kunden legen Datenbanken an, die größer werden als 2 Gbyte. Damit ich die korrekte Dateigröße bekomme, verwende ich FileSeek, das kann mit dem Datentyp __int64 umgehen.
HTH, Jürgen