![]() |
Delphi-Version: 2009
FileStream.SaveToFile verschluckt die letzten Bytes
Ich habe einen Record in eine Klasse verpackt und speichere die Records in einer generischen TObjectList. Ich möchte jetzt die knapp 130.000 Datensätze mit einem Stream in eine Datei speichern. Hierzu verwende ich einen TFileStream und einen TReader/TWriter. Das alles klappt ohne Probleme.
Nun möchte ich gern einen TMemoryStream verwenden, um ihn mit der DEC zu ver-/entschlüsseln. Das mache ich so:
Delphi-Quellcode:
Nunmehr knallt es aber beim Einlesen. Nach mühseliger Suche habe ich mit einem Hexeditor herausgefunden, dass das daran liegt, dass nicht alle Bytes in die Datei geschrieben werden. Der Fehler hat mit der Größenangabe bei
procedure TZielListe.SaveToFile(Dateiname:string;PW:string = '');
var Writer: TWriter; Stream:TMemoryStream; i:integer; begin Stream := TMemoryStream.Create; Writer:= TWriter.Create(Stream, 4096); Try Writer.WriteListBegin; For i := 0 to Self.Count - 1 do begin Writer.WriteInteger(Self[i].Int1); Writer.WriteInteger(Self[i].Int2); Writer.WriteString(Self[i].Text1); Writer.WriteString(Self[i].Text2); Writer.WriteInteger(Self[i].Int64A); Writer.WriteInteger(Self[i].Int64B); Writer.WriteInteger(Self[i].Int64C); end; Writer.WriteListEnd; Stream.SaveToFile(Dateiname); Finally Writer.Free; Stream.Free; End; end;
Delphi-Quellcode:
zu tun. Der letzte Block wird offenbar nicht geschrieben. Nehme ich eine durch 16 teilbare Größe, so werden die letzten über 16 hinausstehenden (hier 4) Bytes nicht mitgespeichert. Nehme ich eine Größe von 1, so wird das letzte Byte nicht geschrieben (nämlich das
Writer:= TWriter.Create(Stream, 4096);
Delphi-Quellcode:
). Nehme ich eine andere Größe (15, 1024 oder 4096), so wird ein entsprechend großer Rest nicht geschrieben.
Writer.WriteListEnd;
Weiß jemand, was hier vorgeht? |
AW: FileStream.SaveToFile verschluckt die letzten Bytes
TWriter nutzt einen Puffer, der erst durch das Free in den Stream übertragen wird. Du musst also das Writer.Free vor das Stream.SaveToFile verschieben.
Alternativ kannst du vor dem Stream.SaveToFile ein "Writer.FlushBuffer" einbauen. |
AW: FileStream.SaveToFile verschluckt die letzten Bytes
Danke, das war's! :thumb:
Ich finde es unmöglich, dass man nirgendwo darauf hingewiesen wird. "FlushBuffer" wird als nur für den internen Gebrauch beschrieben, und was "Free" bewirkt, überhaupt nicht. Da wäre ich nun nie drauf gekommen. Also Danke nochmals. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 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