Difference between revisions of "TFileStream/de"

From Lazarus wiki
Jump to navigationJump to search
(Seite überarbeitet und inhaltlich korrigiert)
(Platz-sparenderer Beispiel-Code.)
Line 5: Line 5:
 
__TOC__
 
__TOC__
  
=Filestream=
+
==Filestream==
 
Filestream ist eine Möglichkeit, Dateien einfach und schnell zu verarbeiten. Der Filestream bietet sich für die Verarbeitung von Dateien jeglicher Größe an.
 
Filestream ist eine Möglichkeit, Dateien einfach und schnell zu verarbeiten. Der Filestream bietet sich für die Verarbeitung von Dateien jeglicher Größe an.
  
Line 52: Line 52:
 
|}
 
|}
  
=Datei lesen=
+
==Datei lesen==
 
In diesen Beispielen wird die Datei vollständig in den Arbeitsspeicher geladen. Damit eignet sich dieser Ansatz nur für kleine bis mittelgroße Dateien. Je nach verfügbaren Arbeitsspeicher kann die sinnvolle Grenze bei einigen Kilobyte bis einigen Megabyte liegen.
 
In diesen Beispielen wird die Datei vollständig in den Arbeitsspeicher geladen. Damit eignet sich dieser Ansatz nur für kleine bis mittelgroße Dateien. Je nach verfügbaren Arbeitsspeicher kann die sinnvolle Grenze bei einigen Kilobyte bis einigen Megabyte liegen.
 
<syntaxhighlight>
 
<syntaxhighlight>
  ...
 
 
 
uses
 
uses
 
   Classes, SysUtils;
 
   Classes, SysUtils;
  
function funDateiEinlesen(strDateiname: string): string;
+
function DateiInStringEinlesen(strDateiname: string): string;
 
 
  ...
 
 
 
implementation
 
 
 
  ...
 
 
 
function funDateiEinlesen(strDateiname: string): string;
 
 
var
 
var
   datQuelldatei: TFileStream;
+
   stream: TFileStream;
 
 
 
begin
 
begin
 
 
   // öffnet eine Datei zum Lesen und sperrt sie gleichzeitig gegen Schreibzugriffe
 
   // öffnet eine Datei zum Lesen und sperrt sie gleichzeitig gegen Schreibzugriffe
   datQuelldatei := TFileStream.Create(strDateiname, fmOpenRead or fmShareDenyWrite);
+
   stream := TFileStream.Create(strDateiname, fmOpenRead or fmShareDenyWrite);
 
 
 
   try
 
   try
     SetLength(funDateiEinlesen, datQuelldatei.Size);
+
     SetLength(Result, stream.Size);
     datQuelldatei.Read(funDateiEinlesen[1], datQuelldatei.Size);
+
     stream.Read(Result[1], stream.Size);
 
   finally
 
   finally
     FreeAndNil(datQuelldatei);
+
     stream.Free;
 
   end;
 
   end;
 
 
end;
 
end;
  ...
+
</syntaxhighlight>
  
</syntaxhighlight>
+
Beispiel für einen Unterprogrammaufruf, um eine Datei in einen String einzulesen und an an Memo anzuhängen:
<br>
 
Beispiel für einen Unterprogrammaufruf um eine Datei einzulesen:
 
 
<syntaxhighlight>
 
<syntaxhighlight>
 
+
   Memo1.Append(DateiInStringEinlesen('test.txt'));
   ...
 
 
 
  // fügt eine Datei an das Ende des Memos an
 
  // das Ziel kann auch ein String sein usw.
 
  memo1.Append(funDateiEinlesen('test.txt'));
 
 
 
  ...
 
 
 
end;
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=Datei schreiben=
+
==Datei schreiben==
 
<syntaxhighlight>
 
<syntaxhighlight>
  ...
 
 
 
uses
 
uses
   Classes;
+
   Classes, SysUtils;
  
procedure subDateiSchreiben(strDateiname: string; strUebergabestring: string);
+
procedure StringInDateiSchreiben(strDateiname, strUebergabestring: string);
 
 
  ...
 
 
 
implementation
 
 
 
  ...
 
 
 
procedure subDateiSchreiben(strDateiname: string; strUebergabestring: string);
 
 
var
 
var
   datZieldatei: TFileStream;
+
   stream: TFileStream;
 
   lngGroesse: longint;
 
   lngGroesse: longint;
 
 
begin
 
begin
 
+
   stream := TFileStream.Create(strDateiname, fmCreate);
   datZieldatei := TFileStream.Create(strDateiname, fmCreate);
 
 
   lngGroesse := Length(strUebergabestring);
 
   lngGroesse := Length(strUebergabestring);
 
 
   try
 
   try
     datZieldatei.Position := 0;
+
     stream.Position := 0;
     datZieldatei.Write(strUebergabestring[1], lngGroesse);
+
     stream.Write(strUebergabestring[1], lngGroesse);
 
   finally
 
   finally
     FreeAndNil(datZieldatei);
+
     stream.Free;
 
   end;
 
   end;
 
 
end;
 
end;
  ...
 
 
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
+
Beispiel für einen Unterprogrammaufruf, um den Memo-Inhalt als String in eine Datei zu schreiben:
Beispiel für einen Unterprogrammaufruf um eine Datei zu schreiben:
 
 
<syntaxhighlight>
 
<syntaxhighlight>
 +
  StringInDateiSchreiben('test1.txt', memo1.Text);
 +
</syntaxhighlight>
  
  ...
 
 
  // schreibt den Inhalt eines Memos in eine Datei
 
  // alternativ geht auch ein String
 
  subDateiSchreiben('test1.txt', memo1.Text);
 
 
  ...
 
 
end;
 
</syntaxhighlight>
 
 
[[Category:Tutorials/de]]{{AutoCategory}}
 
[[Category:Tutorials/de]]{{AutoCategory}}

Revision as of 11:03, 25 April 2018

Template:Translate

Zurück zu den Dateitypen.

Filestream

Filestream ist eine Möglichkeit, Dateien einfach und schnell zu verarbeiten. Der Filestream bietet sich für die Verarbeitung von Dateien jeglicher Größe an.

TFileStream bietet keine Pufferung, sodass bei wiederholtem Zugriff auf einen Teil einer Datei dieser in einen Puffer geladen werden sollte. Auch sollte nicht sequenziell Byte für Byte sondern nach Möglichkeit immer in Blöcken gelesen werden. Für höchste Lesegeschwindigkeit bei großen Dateien sollte sich die Blockgröße an der Größe der Seitengröße des Betriebssystems orientieren.

Konstanten für den Dateizugriff

Diese Konstanten bestimmen, wie auf eine Datei zugegriffen wird. Die Konstanten beginnend mit fmShare können immer mit angegeben werden, werden aber nicht von allen Betriebssystemen unterstützt.

Konstante Dezimalwert Beschreibung
fmCreate 65280 Erstellt eine neue Datei
fmOpenRead 0 öffnet eine Datei lesend
fmOpenWrite 1 öffnet eine Datei schreibend
fmOpenReadWrite 2 öffnet eine Datei lesend und schreibend
fmShareCompat 0
fmShareExclusive 16 exklusiver Dateizugriff; andere Programme können nicht auf die Datei zugreifen
fmShareDenyWrite 32 sperrt den Schreibzugriff auf eine Datei
fmShareDenyRead 48 andere Programme dürfen die Datei nicht lesen, aber weiterhin beschreiben (z.B. weitere Daten anhängen)
fmShareDenyNone 64 andere Programme können weiterhin lesend und schreibend auf die Datei zugreifen.

Datei lesen

In diesen Beispielen wird die Datei vollständig in den Arbeitsspeicher geladen. Damit eignet sich dieser Ansatz nur für kleine bis mittelgroße Dateien. Je nach verfügbaren Arbeitsspeicher kann die sinnvolle Grenze bei einigen Kilobyte bis einigen Megabyte liegen.

uses
  Classes, SysUtils;

function DateiInStringEinlesen(strDateiname: string): string;
var
  stream: TFileStream;
begin
  // öffnet eine Datei zum Lesen und sperrt sie gleichzeitig gegen Schreibzugriffe
  stream := TFileStream.Create(strDateiname, fmOpenRead or fmShareDenyWrite);
  try
    SetLength(Result, stream.Size);
    stream.Read(Result[1], stream.Size);
  finally
    stream.Free;
  end;
end;

Beispiel für einen Unterprogrammaufruf, um eine Datei in einen String einzulesen und an an Memo anzuhängen:

  Memo1.Append(DateiInStringEinlesen('test.txt'));

Datei schreiben

uses
  Classes, SysUtils;

procedure StringInDateiSchreiben(strDateiname, strUebergabestring: string);
var
  stream: TFileStream;
  lngGroesse: longint;
begin
  stream := TFileStream.Create(strDateiname, fmCreate);
  lngGroesse := Length(strUebergabestring);
  try
    stream.Position := 0;
    stream.Write(strUebergabestring[1], lngGroesse);
  finally
    stream.Free;
  end;
end;

Beispiel für einen Unterprogrammaufruf, um den Memo-Inhalt als String in eine Datei zu schreiben:

  StringInDateiSchreiben('test1.txt', memo1.Text);