OSZ Handel I
Informatik

Objektorientierte Programmierung (OOP)
Streams - Implementierung

H. Härtl

[Home | Wirtschaftsgymnasium | Informatik | Unterrichtsmaterialien |Delphi]
 

Zur Genealogie

Streams

Die Klasse TFileStream führt selbst keine neue Eigenschaften ein, sondern erbt alle seine Eigenschaften von seinen Oberklassen.

Eigenschaft

Datentyp

Beschreibung

Position

LongInt

Die Eigenschaft Position gibt den aktuellen Offset im Stream für Lese- und Schreiboperationen an.
Mit Position können Sie die aktuelle Position im Stream ermitteln. Dies ist die Byte-Anzahl ab dem Beginn der Stream-Daten.

Size

LongInt

Die Eigenschaft Size gibt die Größe des Streams in Byte an.
Mit Size können Sie die Größe des Streams ermitteln. Size wird intern in Routinen verwendet, die aus dem Stream lesen und in ihn schreiben.

Handle

LongInt

Die Eigenschaft bezeichnet das Handle der Datei, aus welcher der Stream liest bzw. in welche der Stream schreibt.
Den Wert von Handle benötigen Sie, wenn Sie Dateiverwaltungsfunktionen von WIN-API aufrufen, die ein Handle erfordern.

TStream ist der abstrakte Basisklassentyp für Stream-Objekte, die von verschiedenen Speichermedien wie Festplatten oder im dynamischen Speicher usw. gelesen oder darauf geschrieben werden können. Die entsprechenden Methoden werden auf Ebene der Stream-Klasse lediglich abstrakt eingeführt und es bleibt nachfolgenden Klassen überlassen, diese konkret auszufüllen.

Die Klasse TFileStream implementiert lediglich zwei Methoden und bedient sich ansonsten der geerbten Methoden aus der (betriebssystemnahen) Klasse THandleStream.

 

Eigene Methoden der Klasse TFileStream

Methode

Kurzbeschreibung

 

 

Create (const FileName: string;
Filemode: Word);

Mit Create wird ein Datei-Stream zum Lesen aus oder Schreiben in die benannte Datei instantiiert. Beim Erzeugen des Datei-Streams geben Sie an, wie die Datei geöffnet werden soll.
Der Parameter Filemode steuert, auf welche Art die Datei geöffnet wird. Der Parameter darf aus zwei Elementen bestehen. Die beiden Werte müssen in diesem Fall durch ODER verknüpft werden,
z.B:

fs := Create(´D:\TMP\TEST.DAT´, fmOpenRead OR fmShareExclusive);

Öffnen-Modus kann folgende Konstantenwerte annehmen:

Wert Bedeutung                                                                     

fmCreate Es wird eine Datei mit dem angegebenen Namen angelegt. 
Ist eine solche Datei bereits vorhanden, wird die Datei zum Schreiben geöffnet.

fmOpenRead Die Datei wird ausschließlich zum Lesen geöffnet.

fmOpenWrite Die Datei wird ausschließlich zum Schreiben geöffnet. Beim Schreiben in die Datei wird der aktuelle Inhalt vollständig ersetzt.

fmOpenReadWrite Die Datei wird so geöffnet, daß der aktuelle Inhalt geändert werden kann, ohne daß er ersetzt wird.

Für den Zugriffsmodus sind folgende Konstantenwerte verfügbar:

Wert Bedeutung                                                                     

fmShareCompat Der Zugriffsmodus ist kompatibel zu dem Verfahren, mit dem Dateisteuerblöcke (FCBs) geöffnet werden.

fmShareExclusive Andere Anwendungen können die Datei nicht öffnen.

fmShareDenyWrite Andere Anwendungen können die Datei ausschließlich zum Lesen öffnen.

fmShareDenyRead Andere Anwendungen können die Datei ausschließlich zum Schreiben öffnen.

fmShareDenyNone Andere Anwendungen können die Datei ohne Einschränkungen zum Lesen oder Schreiben öffnen.

Wenn die Datei nicht geöffnet werden kann, löst Create eine Exception aus.

Destroy;

Destroy gibt eine Instanz von TFileStream frei.
Destroy veranlasst, dass das Handle für den Datei-Stream freigegeben wird, bevor die entsprechende Instanz freigegeben wird.

 

Methoden, welche die Klasse TFileStream von der Klasse THandleStream erbt

Methode

Kurzbeschreibung

function Read(var Buffer;

Count: Longint): Longint;

Die Methode Read liest die in Count angegebene Zahl von Bytes aus der Datei, die dem Handle-Stream zugeordnet ist, in den Puffer ein, der mit dem Parameter Buffer bezeichnet ist.
Mit Read können Daten aus einer Datei gelesen werden, die dem Handle-Stream zugeordnet ist und deren Größe in Byte nicht bekannt ist. Beginnend an der aktuellen Position werden maximal so viele Bytes gelesen, wie mit Count angegeben. Anschließend wird die aktuelle Dateiposition der tatsächlich übertragenen Byte-Anzahl angepaßt. Diese Anzahl wird zurückgegeben. Sie ist eventuell kleiner als der Wert von Count, wenn bereits vorher das Dateiende erreicht wird.

fs.Read(Famname, SizeOf(FamName));

(Das Funktionsergebnis wird bei diesem Beispiel nicht ausgewertet.)

Rufen Sie Read nicht auf, wenn die Datei im Modus fmOpenWrite geöffnet wurde, um das Datei-Handle anzufordern.

function Write(const Buffer;
Count: Longint): Longint;

Die Methode Write schreibt die mit Count vorgegebene Anzahl von Bytes aus dem Puffer (Buffer) an die aktuelle Position in der Datei.
Mit Write werden, beginnend an der aktuellen Position, so viele Bytes in die Datei geschrieben, die dem Handle-Stream zugeordnet ist, wie in Count vorgegeben. Die neue Dateiposition wird entsprechend angepaßt. Die Anzahl der tatsächlich geschriebenen Bytes bildet den Rückgabewert.

fs.Write(Famname, SizeOf(FamName));

(Das Funktionsergebnis wird bei diesem Beispiel nicht ausgewertet.)

function Seek(Offset: Longint; Origin: Word): Longint;

Die Methode Seek dient dazu, die „Positionsmarke" innerhalb des Stream auf eine beliebige Position zu setzen.
Der Parameter Origin legt fest, wie der Parameter Offset interpretiert werden soll. Folgende Werte sind für Origin möglich:

Wert Bedeutung                                                                     

soFromBeginning Offset bezieht sich auf den Anfang der Datei. Seek verschiebt zur Position Offset. Offset muß größer oder gleich Null sein.

soFromCurrent Offset bezieht sich auf den aktuellen Wert der Eigenschaft Position. Seek verschiebt zu <aktuelle Position> + Offset.

soFromEnd Offset bezieht sich auf das Ende der Datei. Offset muß kleiner oder gleich Null sein und bezeichnet die Anzahl von Bytes vor dem Dateiende.

Seek gibt den neuen Wert der Eigenschaft Position zurück.

fs.Seek(5 * SizeOf(Datensatz), soFromBeginning);

Positioniert die Positionsmarke innerhalb des Stream auf den Anfang des 6. Datensatzes. (!!!)

procedure SetSize(NewSize: Longint);

Die Methode SetSize plaziert die Dateiendemarkierung, wodurch die Ressource an der angegebenen Position abgeschnitten werden kann.
Mit SetSize kann die Größe der Datei verändert werden. SetSize überschreibt hierzu die geerbte Methode. Zur Lokalisierung der angegebenen Position wird Seek aufgerufen. Anschließend wird das Dateiendezeichen gesetzt. Wenn die Ressource nicht in der Größe verändert werden kann, wird eine Exception ausgelöst. Dies gilt beispielsweise für Datei-Handles, die im Modus fmOpenRead geöffnet wurden.

fs.SetSize(10);

Schneidet alle Daten hinter dem 10. Byte ab.



 29. März 2007     Siegfried Spolwig

Seitenanfang