AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream schreiben

Ein Thema von tomkupitz · begonnen am 25. Okt 2017 · letzter Beitrag vom 26. Okt 2017
Antwort Antwort
tomkupitz

Registriert seit: 26. Jan 2011
339 Beiträge
 
Delphi 12 Athens
 
#1

TFileStream schreiben

  Alt 25. Okt 2017, 19:41
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: TFileStream schreiben

  Alt 25. Okt 2017, 19:59
Wenn du die Datei immer überschreiben willst, musst du fmCreate nehmen. Im Falle von fmOpenRead öffnest du die vorhandene Datei und fängst bei Position 0 an zu (über)schreiben.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: TFileStream schreiben

  Alt 26. Okt 2017, 14:02
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 FS.Size := FS.Position; , vor dem Schließen der Datei.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Okt 2017 um 14:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TFileStream schreiben

  Alt 26. Okt 2017, 14:55
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" 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(...
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter (26. Okt 2017 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TFileStream schreiben

  Alt 26. Okt 2017, 15:04
Gelöscht
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von bytecook
bytecook

Registriert seit: 6. Aug 2010
Ort: Dornbirn
151 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TFileStream schreiben

  Alt 26. Okt 2017, 15:52
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.
Peter
Was mache ich, wenn ein Bär meine Frau angreift?
Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.
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