![]() |
Datei in Streams zerstückeln
Ich möchte unter Verwendung
![]() Nun ist meine Frage, wie ich in einen Stream nur maximal 30MB lden kann, und diese dann nacher wieder zusammensetzten kann. |
Re: Datei in Streams zerstückeln
Delphi-Quellcode:
du kannst auch sowas machen wie "gib mir Block mit Nummer":
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try BlockSize := 30*1024*1024; i := 0; while i < fs.Size do begin SetLength(S, BlockSize); //fs.Position := i; i2 := fs.Read(S[1], BlockSize); SetLength(S, i2); Inc(i, i2); // hier bekommst du in S jeweils maximal 30 MB-Teilstücke end; finally fs.Free; end;
Delphi-Quellcode:
BlockNummer := X;
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try BlockSize := 30*1024*1024; SetLength(Result, BlockSize); fs.Position := BlockNummer * BlockSize; i2 := fs.Read(Result[1], BlockSize); SetLength(Result, i2); // hier bekommst du in S jeweils den X-ten Block mit maximal 30 MB finally fs.Free; end; // oder auch erst hier (wäre gut für 'ne Funktion) Und zum zusammensetzen mußt du dann nur alle Teilstücker nacheinander wieder mit fs.Write in einen Stream reinschreiben. PS: oder such mal nach ![]() Aber warum will man eine sehr große Datei in vielen INIs speichern? (ich dank mal dafür gibt es besser geeignete Formate) |
Re: Datei in Streams zerstückeln
Zitat:
ich glaube da hast Du die Theorie von Streams noch nicht so richtig verstanden. Ein Stream ist eigentlich nur eine Art Verbindung zwischen zwei Punkten. Etwas unsauber kann man hier vielleicht besser von einem Kanal als Strom sprechen. Du kannst Daten zwischen zwei Endpunkten hin- und her bewegen. Beim Schreiben in den Stream landen die Daten nicht direkt im Stream, sondern dort, wo dieser Stream (Kanal) endet. Liest Du Daten aus dem Stream, so werden sie von diesem Endpunkt gelesen und nur über den Stream zu Dir transportiert. Der Stream selbst hält dabei nicht wirklich die Daten. Wo diese gespeichert werden hängt mit der Implementierung der abstrakten Klasse TStream zusammen. Hier kommen Strings, Dateien, Speicherblöcke, aber auch alles andere in Frage. Für eine Datei empfiehlt sich natürlich ein TFileStream. Erzeugst Du nun einen TFileStream, so wird zu keinem Zeitpunkt die ganze Datei in den Speicher geladen. Du erzeugst nur einen Kanal, der Daten in die Datei (bzw. aus ihr heraus) transportieren kann. Zitat:
Delphi-Quellcode:
var fs: TFileStream;
buffer: String; count: Integer; begin fs := TFileStream.Create(...); try // erzeugen eines 30 MByte Puffers setLength(buffer, 30 * 1024 * 1024); // Lesen der Datei in 30 Mbyte Blöcken repeat count := fs.Read(buffer[1], 30 * 1024 * 1024); // weiterarbeiten mit dem String // Achtung, Count gibt an wie viele Bytes vom Puffer // wirklich verwendet werden, der letzte String muss // nicht die vollen 30 MByte umfassen .... until count < 0; finally fs.Free; end; Zitat:
Gruß Der Unwissende [edit] kein roter Kasten, sorry [/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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