Verweis: | FileCreate FileWrite FileRead |
Uses: | sysutils |
Eingabe: | Handle,Buffer,Länge |
Ausgabe: | Länge |
Funktion: | Schreibt eine Datei auf die Festplatten und reserviert es für die Zeit gegen zugriffe von anderen Prtogrammen oder Usern. |
Beispiel 1
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton auf die Form. Binden Sie die Unit: SysUtils mit der Uses-Klausel in die Anwendung ein.
procedure TForm1.Button1Click(Sender: TObject);
var
HandleNummer, f: integer;
DateiName: string;
MeinBereich: array [1..32] of byte;
Zeichen: integer;
begin
DateiName := 'C:\Mein.hex';
HandleNummer := FileCreate(DateiName);
if HandleNummer = -1 then ShowMessage('Fehler bei der Handlenummerübergabe.');
//Beschreiben der Datei
//Handle nummer->Buffer stelle,Buffer Länge Byte =1
for f := 1 to 32 do MeinBereich[f] := $21;
Zeichen := FileWrite(HandleNummer, MeinBereich, 32);
FileClose(HandleNummer);
ShowMessage('Länge der Datei: '+IntToStr(Zeichen)+' Bytes');
end;
Wenn Sie den Befehl FileCreate noch nicht kennen dann sollten Sie sich zuerst die Informationen hier rüber durchlesen. Dieser Text baut darauf auf. Der Befehl FileWrite beschreibt eine Datei die zuvor mit dem FileCreate erstellt wurde. In dem Quelltext erstellen wir eine Datei mit dem Namen „C:\Mein.hex“. Da es sich hierbei um eine untypisierte Datei Handelt verzichte ich hier auf die Bezeichnung „*.txt“. Zum Anschaufen der Datei sollten Sie sich einen Hexeditor herunterladen. Nur so können Sie selbst für sich sehen was mit der Datei passiert. Es gibt bei untypiesierten Dateien ein paar Besonderheiten. Deswegen hat der ganze Befehlssatz der mit File… beginnt, viel mit den Befehlen BlockRead, BlockWrite gemeinsam. Um nun weiter zu sehen, was in der Datei „C:\Mein.hex“ geschieben steht, starte ich nun den HexEditor und schaue dort nach, indem ich die Datei in den Editor lade.

Mit dem For Befehl beschreiben wir unser Byte-Array Namens „MeinBereich“ mit dem Wert $21. Wobei das $ für einen hexagonalen Wert steht. Dieser Wert ist dann dezimal 33 und bezeichnet in der ASCII-Tabelle das Ausrufezeichen. Nun haben wir durch die For-Schleife unser Array mit diesem Wert gefüllt. Mit dem Befehl FileWrite starten wir nun die Ausgaben unseres Arrays in die Datei. Hierzu nehmen wir:
- Parameter 1 Das Handle
- Parameter 2 Unser Array (Buffer)
- Parameter 3 Die Länge des Arrays (Buffers)
Zurück bekommen wir die Länge der Datei in Bytes. Die Länge besteht hier aus 32 Bytes, da unser Array auch aus 32 Bytes besteht. Um die Länge der Datei zu kontrollieren brauchen Sie keinen Hex-Editor. Da reicht es wenn Sie sich im Dateiexplorer die Eigenschaften anschauen.

Der Befehl FileWrite bestimmt die Länge der Datei. Wenn Sie im Quelltext den Wert 32 auf 20 ändern dann bekommen sie auch nur eine Datei mit 20 Byte Länge. Die ersten 20 Byte. Die restlichen Byte sind zwar in unserem Array (Buffer), aber diese gehen beim Beenden des Programms verloren, da sie nicht abgespeichert wurden. Nun kommt der Zeitpunkt an dem Ich Ihnen gestehen muss, dass der Quelltext von Beispiel 1 schlecht ist. Dabei wollte ich Sie nicht auf’s Glatteis führen. Vielmehr war es mir wichtig mit Zahlen zu hantieren, um Sie nicht gleich zu sehr zu verwirren.
Beispiel 2
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton auf die Form. Binden Sie die Unit: SysUtils mit der Uses-Klausel in die Anwendung ein.
procedure TForm1.Button1Click(Sender: TObject);
var
HandleNummer, f: integer;
DateiName: string;
MeinBereich: array [1..32] of Word;
Zeichen: integer;
begin
DateiName := 'C:\Mein.hex';
HandleNummer := FileCreate(DateiName);
if HandleNummer = -1 then ShowMessage('Fehler bei der Handlenummerübergabe.');
//Beschreiben der Datei
//Handle nummer->Buffer stelle,Buffer Länge Byte =1
for f := 1 to High(MeinBereich) do MeinBereich[f] := $21;
Zeichen := FileWrite(HandleNummer, MeinBereich, SizeOf(MeinBereich));
FileClose(HandleNummer);
ShowMessage('Länge der Datei: '+IntToStr(Zeichen)+' Bytes');
end;
In dem Beispiel 2 habe ich 3 Veränderungen vorgenommen:
- 1. Das Array ist jetzt vom Typ Word.
- 2. In der For-Schleife wurde der Wert 32 durch High(MeinBereich) ersetzt.
- 3. Die Länge des Buffers im Befehl FileWrite wurde durch FileWrite SizeOf(MeinBereich) ersetzt.
Obwohl wir immer noch ein Array von 32 Segmenten besitzen hat sich die Speicherplatzgröße des Arrays verdoppelt. Denn Word ist 2 Byte groß. High(MeinBereich) hat einen Vorteil, wenn wir das Array vergrößern wollen, brauchen wir den Befehl in der For-Schleife nicht zu verändern. Der Befehl SizeOf(MeinBereich) gibt die länge von „MeinBereich“ (Buffer) zurück. Bitte kommen Sie hier nicht auf die Idee SizeOf durch High zu ersetzen. Denn High ist die Anzahl der Segmente im Array (32) und SizeOf (64) ist der benötigte Speicherplatz. In diesem Fall würden Sie durch den Einsatz von High die Hälfte Ihrer Daten verlieren. Bei einem Integer Array hätten Sie nur noch ein Viertel. Wenn Sie das Beispiel Ausführen bekommen Sie den Wert 64 Bytes zurück.

Obwohl wir immer noch ein Array von 32 Segmenten besitzen hat sich die Speicherplatzgröße des Arrays verdoppelt. Denn Word ist 2 Byte groß. High(MeinBereich) hat einen Vorteil, wenn wir das Array vergrößern wollen, brauchen wir den Befehl in der For-Schleife nicht zu verändern. Der Befehl SizeOf(MeinBereich) gibt die länge von „MeinBereich“ (Buffer) zurück. Bitte kommen Sie hier nicht auf die Idee SizeOf durch High zu ersetzen. Denn High ist die Anzahl der Segmente im Array (32) und SizeOf (64) ist der benötigte Speicherplatz. In diesem Fall würden Sie durch den Einsatz von High die Hälfte Ihrer Daten verlieren. Bei einem Integer Array hätten Sie nur noch ein Viertel. Wenn Sie das Beispiel Ausführen bekommen Sie den Wert 64 Bytes zurück. Da der Word typ Zahlen bis 65535 fassen kann haben wir bei 33 nur bei jedem 2. Byte ein Ausrufezeichen. Wenn wir 64 Ausrufezeichen wollen dann können wir auch die Dezimalzahl 8481 angeben. Dies entspricht dem Wert $2121. Sie könnten aber auch das Array auf 64 Vergrößern und dann den Type Byte angeben und dann das Array wie gehabt wieder mit $21 oder 33 bestücken. Die Datei bleibt gleich. Nur die Interpretation der Zeichenfolge ist eine andere. Typisch für untypisierte Variablen. 🙂 Noch ein letztes Beispiel.
Beispiel 3
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton auf die Form. Binden Sie die Unit: sysutils mit der Uses-Klausel in die Anwendung ein.
procedure TForm1.Button1Click(Sender: TObject);
var
HandleNummer, f: integer;
DateiName: string;
MeinBereich: array [1..16] of Integer;
Zeichen: integer;
begin
DateiName := 'C:\Mein.hex';
HandleNummer := FileCreate(DateiName);
if HandleNummer = -1 then ShowMessage('Fehler bei der Handlenummerübergabe.');
//Beschreiben der Datei
//Handle nummer->Buffer stelle,Buffer Länge Byte =1
for f := 1 to High(MeinBereich) do MeinBereich[f] := 555819297;
FileClose(HandleNummer);
Zeichen := FileWrite(HandleNummer, MeinBereich, SizeOf(MeinBereich));
//FileClose(HandleNummer);
ShowMessage('Länge der Datei: '+IntToStr(Zeichen)+' Bytes');
end
Hier sehen wir was passiert wenn, die Datei nicht geschrieben werden konnte. Ich habe in dem Quelltext eine Zeile vor dem FileWrite Befehl, die Datei geschlossen. Somit habe ich das Handle wieder freigegeben. Danach kann ich das Handle nicht benutzen um eine Datei zu schreiben. Daher bekomme ich den unmöglichen Rückgabewert von -1. Dies bedeutet, dass es Hier zu einem Fehler kam. Sie können dies als Kontrollwert in Ihrem Programm einbauen. Weil der Rückgabe wert vom Typ Longint (Integer) ist kann dieser 32-Bit mit Vorzeichen verarbeiten. Daher funktioniert der Befehl FileWrite bis zu einer Dateigröße von 2GB. FileWrite ist analog zu Write jedoch mit der Pflicht einer Handle-Nummer.
Wenn Sie das Programm zum laufen bringen wollen, dann kommentieren Sie die Datei mit dem FileClose Befehl aus und den anderen aktivieren Sie. Wenn sie alles richtig gemacht haben, wird wieder die gleiche Datei mit den gleichen Werten geschrieben da 555819297 = $21212121 ist und das sind !!!! Es könnte aber auch ein Farbe sein oder sonst was.