FileOpen

Verweis: FileCreate FileWrite FileRead
Uses: SysUtils
Eingabe: Dateiname als String, Modus
Ausgabe: Handlenummer mit dem die Datei angesprochgen wird.
Funktion: Öffnet eine bestehende Datei und riegelt diese ab.

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, Zeichen, f: integer;
  DateiName: string;
  MeinBereich: array [1..16] of byte;
begin
  DateiName := 'C:\Mein.hex';
  HandleNummer := FileCreate(DateiName);
  //Beschreiben der Datei
  //Handle nummer->Buffer stelle,Buffer Länge Byte =1
  for f := 1 to High(MeinBereich) do MeinBereich[f] := f;
  Zeichen := FileWrite(HandleNummer, MeinBereich, SizeOf(MeinBereich));
  //Wenn was nicht klappt gehe Raus.
  if Zeichen = -1 then
  begin
    ShowMessage('Fehler beim Erzeugen der Datei.');
    exit;
  end;
  //FileClose Schließt die Datei.
  FileClose(HandleNummer);
  //Öffne die Datei und übergebe das Handle
  HandleNummer := FileOpen('C:\Mein.hex', fmOpenReadWrite);
  ShowMessage('Die Datei ist offen und wird nun vom Programm belegt.');
  FileClose(HandleNummer);
end;

In diesem Beispiel geht es weniger um den Inhalt. Wichtiger ist hier nun die Handhabung der Datei. Wenn Sie das Programmstarten wird eine Datei mit dem Befehl FileCreate erzeugt. OpenFile kann nur bereits existierende Dateien öffnen. Wenn Sie auf den Button Drücken wird die erzeugte Datei mit OpenFile geöffnet. Wenn Sie nun in den Dateiexplorer wechseln, und von dort aus versuchen Datei zu löschen dann ergibt sich folgendes Bild.

Eine geöfnete Datei kann nicht gelöscht werden.
Das löschen der Datei ist nicht möglich.

Warum das Verhalten sinnvoll ist habe ich hier unter FileCreate bereits erklärt. Vielleicht sind Sie gerade als Windows User bereits öfters auf das Phänomen gestoßen. Manchmal kann man gar nicht verstehen warum man diese Datei nicht löschen kann. Dann ist es meist der Grund das die Datei von irgendeinem Prozess benutzt wird. Und gerade unter Windows 10 gibt es sehr viele Prozesse die im Hintergrund laufen. In unserem Programm wird mit CloseFile die Datei wieder Freigegeben die Datei ist aber auch nicht mehr geschützt wen das Programm aus irgend einem Grund abgebrochen wurde, ohne das die Datei geschlossen wurde. Dies können Sie hier nachvolziehen wenn Sie das Schließen der Datei auskommnetieren. Etwa so.

//FileClose(HandleNummer); 

Das Handle der Datei wird auch beendet, wenn das Programm-Handle von Project1.exe beendet wird.

Die Funktion FileOpen hat 2 Modi anzubieten diese werden durch einen Trick in einen Parameter gepackt. Da wäre zunächst einmal die Möglichkeit wie ich die Datei programmintern behandeln möchte. Zur Auswahl stehen hier.

  • fmOpenRead -> Nur Lesen
  • fmOpenWrite -> Nur Schreiben
  • fmOpenReadWrite -> Lesen und Schreiben

Diese Modi dürften jedem klar sein, wenn nicht, unter FileTruncate habe ich ein Beispiel für fmOpenRead und die Auswirkungen.

Widmen wir uns also nun der 2. Möglichkeit der Einstellungen. Hier geht es darum, welche Rechte die anderen Programme erhalten. Aus Gründen der Übersichtlichkeit habe ich das Beispielprogramm extrem gekürzt. Dies setzt jedoch voraus das die Datei C:\Mein.hex existiert. In dem Programm wird auch auf Sicherheitsabfragen verzichtet.

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: integer;
begin
  //Öffne die Datei und übergebe das Handle
  HandleNummer := FileOpen('C:\Mein.hex', fmOpenReadWrite + fmShareDenyRead);
  //Bei Anzeige der Meldung mit anderen Programmen veruchen die Datei zu öffnen.
  ShowMessage('Die Datei ist offen und wird nun vom Programm belegt.');
  FileClose(HandleNummer);
end;

Die Option fmShareDenyWrite sperrt den Zugriff von anderen Programmen. Hierbei ist nicht die Rede vom Schreiben denn die Ist bei jeder Option gesperrt, solange die Datei offen ist. Nein hier geht es um das öffnen der Datei mit anderen Programmen. Um ehrlich zu sein, werde ich aus der Anleitung noch nicht so ganz schlau. Ich habe hier mit Windows 10 und der Einstellung fmOpenReadWrite folgende Ergebnisse erzielt.

Share ModesZahlwertAnzeigen erlaubt ?
fmShareCompat$0000Nein
fmShareExclusive$0010Nein
fmShareDenyWrite$0020Ja
fmShareDenyRead$0030Nein
fmShareDenyNone$0040Ja

Die ersten Parameter sind Zahlenwerte von Read und Write sind 0,1,2 hier wird bei Bedarf der 2.Parameter hinzuaddiert. Damit ist fmShareCompat die Default-Einstellung weil null. Wenn Sie nun versuchen die Datei mit einem anderen Programm zu öffnen, gelingt dies nur bei fmShareDenyWrite und fmShareDenyNone.