![]() |
Streamlesefehler
Ich schreibe einen Reecord an das Ende einer Datei. Das klappt. Nur beim Auslesen bekomme ich einen StreamleseFehler:
Delphi-Quellcode:
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.
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; |
Re: Stream lese fehler
Erwartet Writebuffer einen Pointer als ersten Parameter? :gruebel:
|
Re: Streamlesefehler
In der Hilfe steht nur Type. Aber ich habe es auch schon so probiert:
Delphi-Quellcode:
Gleiche Fehler.
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; |
Re: Streamlesefehler
Hallo,
fsCarrier.Seek(-SizeOf(TFileInfo), soFromEnd); steht zumindestens so in der Hilfe. Heiko |
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. |
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 |
Re: Streamlesefehler
Auf dem letzten Zeichen oder LetztesZeichen +1 ?
Gruß K-H |
Re: Streamlesefehler
Hallo,
Also klappt es jetzt? Weil du hattest in deinem ursprünglichen Code (noch) einen anderen Fehler:
Delphi-Quellcode:
hätte
fsCarrier.ReadBuffer(FileInfo, Sizeof(TFileInfo));
Delphi-Quellcode:
heißen müssen.
fsCarrier.ReadBuffer(FileInfo^, Sizeof(TFileInfo));
Gruß Neutral General |
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. |
Re: Streamlesefehler
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 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