Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Datei stückchenweise mit TFileStream einlesen (https://www.delphipraxis.net/9779-datei-stueckchenweise-mit-tfilestream-einlesen.html)

Luckie 3. Okt 2003 23:34


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:
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;
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, ...

So geht es auch nicht:
Delphi-Quellcode:
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;
Gleiche Fehler.

Kamil 3. Okt 2003 23:43

Re: Datei stückchenweise mit TFileStream einlesen
 
In eine cardinal Variable passen nur 32 Bit...
Nimm ein Array:
Code:
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;
Du kannst auch mit pointer arbeiten:
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;

Luckie 3. Okt 2003 23:49

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:
while SrcStream.Position < SrcStream.Size do
Bekomme ich zum Schluß wieder einen Stream-Lesefehler.

Kamil 3. Okt 2003 23:57

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;
...

Luckie 4. Okt 2003 00:03

Re: Datei stückchenweise mit TFileStream einlesen
 
Der Schuß ins Blaue ging daneben. Len ist immer 0. Er liest und schreibt also gar nichts.

Kamil 4. Okt 2003 00:10

Re: Datei stückchenweise mit TFileStream einlesen
 
Code:
if SrcStream.Size-SrcStream.Position>1024 then
  Len=1024
else
  Len:=SrcStream.Size-SrcStream.Position;
Bin schon ein wenig müde...

Luckie 4. Okt 2003 00:14

Re: Datei stückchenweise mit TFileStream einlesen
 
Perfekt, der saß genau im Bulleseye. Besten Dank.

Kamil 4. Okt 2003 00:33

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;
...

Luckie 4. Okt 2003 02:49

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.

Christian Seehase 4. Okt 2003 03:00

Re: Datei stückchenweise mit TFileStream einlesen
 
Moin Luckie,

komisch.
An welcher Stelle denn?

Im Prinzip müsste es auch so gehen:

Delphi-Quellcode:
  iLen := fsIN.Read(sBuf[1],iBlockSize);
  while iLen > 0 do begin
    fsOUT.Write(sBuf[1],iLen);
    iLen := fsIN.Read(sBuf[1],iBlockSize);
  end;
Statt eines Strings wie bei mir kannst Du natürlich auch einen anderen Buffer (array of char) nehmen.
Lesefehler dürftest Du nur bei ReadBuffer bekommen, nicht bei Read.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr.
Seite 1 von 2  1 2      

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