Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Streamlesefehler (https://www.delphipraxis.net/148623-streamlesefehler.html)

Luckie 5. Mär 2010 05:52


Streamlesefehler
 
Ich schreibe einen Reecord an das Ende einer Datei. Das klappt. Nur beim Auslesen bekomme ich einen StreamleseFehler:
Delphi-Quellcode:
type
  TFileInfo = packed record
    FFilename: String[255];
    FFileSize: Integer;
  end;
  PFileInfo = ^TFileInfo;

procedure TAppendFile.AppendFileInfo(FileInfo: TFileInfo);
var
  fsCarrier: TFileStream;
begin
  fsCarrier := TFileStream.Create(FCarrierFile, fmOpenWrite);
  try
    fsCarrier.Seek(fsCarrier.Size, soFromBeginning);
    fsCarrier.WriteBuffer(FileInfo, SizeOf(TFileInfo));
  finally
    fsCarrier.Free;
  end;
end;

procedure TAppendFile.Extract;
var
  fsCarrier: TFileStream;
  FileInfo: PFileInfo;
begin
  fsCarrier := TFileStream.Create(FCarrierFile, fmOpenRead);
  try
    fsCarrier.Seek(SizeOf(TFileInfo), soFromEnd);
    new(FileInfo);
    fsCarrier.ReadBuffer(FileInfo, Sizeof(TFileInfo));
    ShowMessage(IntToStr(PFileInfo(FileInfo)^.FFileSize));
  finally
    fsCarrier.Free;
  end;
end;
Und es ist mir ein Rätsel wieso. Der Dateizeiger steht an der richtigen Stelle. Das habe ich mit Position geprüft. Und der Dateiname steht auch in der Datei am Ende. Das hab eich mit einem Hexeditor geprüft.

alzaimar 5. Mär 2010 06:10

Re: Stream lese fehler
 
Erwartet Writebuffer einen Pointer als ersten Parameter? :gruebel:

Luckie 5. Mär 2010 06:15

Re: Streamlesefehler
 
In der Hilfe steht nur Type. Aber ich habe es auch schon so probiert:
Delphi-Quellcode:
procedure TAppendFile.Extract;
var
  fsCarrier: TFileStream;
  FileInfo: TFileInfo;
begin
  fsCarrier := TFileStream.Create(FCarrierFile, fmOpenRead);
  try
    fsCarrier.Seek(SizeOf(TFileInfo), soFromEnd);
    fsCarrier.ReadBuffer(FileInfo, Sizeof(TFileInfo));
    ShowMessage(IntToStr(FileInfo.FFileSize));
  finally
    fsCarrier.Free;
  end;
end;
Gleiche Fehler.

hoika 5. Mär 2010 06:17

Re: Streamlesefehler
 
Hallo,

fsCarrier.Seek(-SizeOf(TFileInfo), soFromEnd);


steht zumindestens so in der Hilfe.


Heiko

Luckie 5. Mär 2010 06:20

Re: Streamlesefehler
 
Argh. :wall:

Ich dachte, er würde automatisch zurückgehen, wen ich soFromEnd angebe. Dass man den Wert auch noch negativ angeben muss...

Besten Dank.

hoika 5. Mär 2010 06:45

Re: Streamlesefehler
 
Hallo,

29.000 Beiträge und dann so ein Fehler tztz ;)
OK, ich hatte gerade das D6-Handbuch auf.

jaja, damals gab es sowas ;)


soFromEnd kann man auch mit 0 aufrufen,
dann steht er genau am Ende.


Heiko

p80286 5. Mär 2010 09:20

Re: Streamlesefehler
 
Auf dem letzten Zeichen oder LetztesZeichen +1 ?

Gruß
K-H

Neutral General 5. Mär 2010 09:28

Re: Streamlesefehler
 
Hallo,

Also klappt es jetzt?

Weil du hattest in deinem ursprünglichen Code (noch) einen anderen Fehler:

Delphi-Quellcode:
fsCarrier.ReadBuffer(FileInfo, Sizeof(TFileInfo));
hätte

Delphi-Quellcode:
fsCarrier.ReadBuffer(FileInfo^, Sizeof(TFileInfo));
heißen müssen.

Gruß
Neutral General

himitsu 5. Mär 2010 10:26

Re: Streamlesefehler
 
@General: der Buffer ist als offener Var-Paramete deklariert, also stimmt schon
ach nee :oops:

@Luckie: Dieser Wert wird immer in der Selben Richtung angegeben
- positiv nach hinten
- und negativ zurück

Welche "Startposition" verwendet wird, spielt dabei keine Rolle.
Also wenn man vom Ende aus zurück möchte, dann ist es halt ein negativer Wert.

Luckie 5. Mär 2010 12:35

Re: Streamlesefehler
 
Zitat:

Zitat von Neutral General
Hallo,

Also klappt es jetzt?

Weil du hattest in deinem ursprünglichen Code (noch) einen anderen Fehler:

Delphi-Quellcode:
fsCarrier.ReadBuffer(FileInfo, Sizeof(TFileInfo));
hätte

Delphi-Quellcode:
fsCarrier.ReadBuffer(FileInfo^, Sizeof(TFileInfo));
heißen müssen.

Nö, funktioniert auch so ohne derefenrenzieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 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