Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TFileStream schreiben (https://www.delphipraxis.net/194182-tfilestream-schreiben.html)

tomkupitz 25. Okt 2017 19:41

TFileStream schreiben
 
Hallo,

ich möchte eine neue Datei bzw. einen neuen Dateiinhalt anlegen.

Ich nutze fs:=TFileStream.Create('...', fmOpenWrite) und dann fs.Write(...). Ist die Datei (300Bytes) bereits vorhanden und ich schreibe 200Bytes, dann ist die Dateigröße nach fs.Free immer noch 300Bytes groß. Sie soll aber 200Bytes groß sein. Was habe ich nicht beachtet?

Beste Grüße

Zacherl 25. Okt 2017 19:59

AW: TFileStream schreiben
 
Wenn du die Datei immer überschreiben willst, musst du
Delphi-Quellcode:
fmCreate
nehmen. Im Falle von
Delphi-Quellcode:
fmOpenRead
öffnest du die vorhandene Datei und fängst bei Position 0 an zu (über)schreiben.

himitsu 26. Okt 2017 14:02

AW: TFileStream schreiben
 
Und fmOpenWrite knallt auch, wenn die Datei vorher noch nicht existiert, denn sie lässt sich bekanntlich nicht so gut öffnen.

Einige FileAPIs bieten auch ein fmOpenNew an, was TRUNCATE_EXISTING (MSDN-Library durchsuchenCreateFile) entspricht.

Mir war so, als wenn TFileStream auch MSDN-Library durchsuchenSetEndOfFile implementiert, also entsprechend einem Bei Google suchenFileTruncate, nur ich fand grade nichts,
aber indirekt geht auch
Delphi-Quellcode:
FS.Size := FS.Position;
, vor dem Schließen der Datei.

Codehunter 26. Okt 2017 14:55

AW: TFileStream schreiben
 
Ich dachte bisher immer, TFileStream.Position stünde auf TFileStream.Size nach dem .Create? Zur Sicherheit würde ich das so machen:

Delphi-Quellcode:
FS:= TFileStream.Create(fmCreate or fmOpenWrite)
FS.Seek(0, soFromEnd); // oder: FS.Position:= FS.Size; (keine Ahnung was schneller ist ^^)
FS.Write(...
EDIT:
Noch vergessen, den "Egositen-Modus"
Delphi-Quellcode:
FS:= TFileStream.Create(fmCreate or fmOpenWrite or fmShareExclusive)
damit hier auch nix schief geht ;-)

Noch'n EDIT:
Grade gesehen, du willst ja nicht anhängen sondern ersetzen. Dann so:
Delphi-Quellcode:
FS:= TFileStream.Create(fmCreate or fmOpenWrite or fmShareExclusive);
FS.Size:= 0;
FS.Write(...

Codehunter 26. Okt 2017 15:04

AW: TFileStream schreiben
 
Gelöscht

bytecook 26. Okt 2017 15:52

AW: TFileStream schreiben
 
Noch ein kleiner Tipp zu Streams.

Es ist sicherer, WriteBuffer sowie ReadBuffer statt Write und Read zu verwenden. Können aus irgedeinem Grund nicht die angegebenen Bytes geschrieben oder gelesen werden, so erhält man eine EWrite- oder EReadException.


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