![]() |
Datei stückchenweise mit TFileStream einlesen
Ich versuche eien Datei stückchenweise mit ReadBuffer einzulesen, den Buffer zu verarbeiten und dann das Ganze wieder zu schreiben.
Delphi-Quellcode:
Aber das will nicht so recht. Ich bekomme da immer einen Stream.Lesefehler. Es hadelt sich um alle möglichen Dateien, binär, Text, typisierte, ...
var
SrcBuffer, DestBuffer: cardinal; begin while SrcStream.Position < SrcStream.Size do begin SrcStream.ReadBuffer(SrcBuffer, 1024); EncodeBuffer(SrcBuffer, DestBuffer, 1024); DestStream.WriteBuffer(DestBuffer, 1024); end; So geht es auch nicht:
Delphi-Quellcode:
Gleiche Fehler.
var
SrcBuffer, DestBuffer: Pointer; begin GetMem(SrcBuffer, 1024); GetMem(DestBuffer, 1024); while DestStream.Size < SrcStream.Size + sizeof(TFileHeader) do begin SrcStream.ReadBuffer(SrcBuffer, 1024); EncodeBuffer(SrcBuffer, DestBuffer, 1024); DestStream.WriteBuffer(DestBuffer, 1024); end; |
Re: Datei stückchenweise mit TFileStream einlesen
In eine cardinal Variable passen nur 32 Bit...
Nimm ein Array:
Code:
Du kannst auch mit pointer arbeiten:
var
SrcBuffer, DestBuffer: array[0..1023] of byte; begin while SrcStream.Position < SrcStream.Size do begin SrcStream.ReadBuffer(SrcBuffer[0], 1024); EncodeBuffer(SrcBuffer[0], DestBuffer[0], 1024); DestStream.WriteBuffer(DestBuffer[0], 1024); end;
Code:
SrcBuffer, DestBuffer: pointer;
begin getmem(SrcBuffer, 1024); getmem(DeasBuffer, 1024); try while SrcStream.Position < SrcStream.Size do begin SrcStream.ReadBuffer(SrcBuffer^, 1024); EncodeBuffer(SrcBuffer^, DestBuffer^, 1024); DestStream.WriteBuffer(DestBuffer^, 1024); end; finally freemem(SrcBuffer); freemem(DestBuffer); end; |
Re: Datei stückchenweise mit TFileStream einlesen
Ha, da war ich doch gar nicht soweit weg. Blos die Abbruchbedingung stimmt noch nicht ganz. Ich schreibe in den ZielStream erst einen Header und dann den QuellStream. Nur mit
Delphi-Quellcode:
Bekomme ich zum Schluß wieder einen Stream-Lesefehler.
while SrcStream.Position < SrcStream.Size do
|
Re: Datei stückchenweise mit TFileStream einlesen
Code:
var
Len: integer; ... begin ... while SrcStream.Position < SrcStream.Size do begin Len:=(SrcStream.Size-SrcStream.Position) mod 1025; SrcStream.ReadBuffer(SrcBuffer^, Len); EncodeBuffer(SrcBuffer^, DestBuffer^, Len); DestStream.WriteBuffer(DestBuffer^, Len); end; ... |
Re: Datei stückchenweise mit TFileStream einlesen
Der Schuß ins Blaue ging daneben. Len ist immer 0. Er liest und schreibt also gar nichts.
|
Re: Datei stückchenweise mit TFileStream einlesen
Code:
Bin schon ein wenig müde...
if SrcStream.Size-SrcStream.Position>1024 then
Len=1024 else Len:=SrcStream.Size-SrcStream.Position; |
Re: Datei stückchenweise mit TFileStream einlesen
Perfekt, der saß genau im Bulleseye. Besten Dank.
|
Re: Datei stückchenweise mit TFileStream einlesen
Da fällt mir noch ein:
Falls du statt ReadBuffer Read nimmst, dann kannst du es so machen:
Code:
var
Len: integer; ... begin ... while SrcStream.Position < SrcStream.Size do begin Len:=SrcStream.Read(SrcBuffer^, 1024); EncodeBuffer(SrcBuffer^, DestBuffer^, Len); DestStream.WriteBuffer(DestBuffer^, Len); end; ... |
Re: Datei stückchenweise mit TFileStream einlesen
Hm, Jetzt hab eich es so, aber die zweite Lösung wäre wohl performanter, da die if-Abfrage wegfällt. Und da waren sie wieder meine drei Problem... Stream-Lesefehler.
|
Re: Datei stückchenweise mit TFileStream einlesen
Moin Luckie,
komisch. An welcher Stelle denn? Im Prinzip müsste es auch so gehen:
Delphi-Quellcode:
Statt eines Strings wie bei mir kannst Du natürlich auch einen anderen Buffer (array of char) nehmen.
iLen := fsIN.Read(sBuf[1],iBlockSize);
while iLen > 0 do begin fsOUT.Write(sBuf[1],iLen); iLen := fsIN.Read(sBuf[1],iBlockSize); end; Lesefehler dürftest Du nur bei ReadBuffer bekommen, nicht bei Read. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 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 by Thomas Breitkreuz