FileOpen

Öffnet eine Datei, um bestimmte Inhalte aus ihr zu lesen und/oder in diese zu schreiben.

FileObj := FileOpen(DateiName, Flags , Kodierung)

Parameter

DateiName

Typ: Zeichenkette

Name der Datei, die geöffnet werden soll. Wenn kein absoluter Pfad angegeben ist, wird die Datei im A_WorkingDir-Verzeichnis vermutet.

Geben Sie ein Sternchen (oder zwei) wie unten gezeigt an, um die Standardeingabe, Standardausgabe oder Standardfehlerausgabe zu öffnen:

FileOpen("*", "r")   ; für stdin
FileOpen("*", "w")   ; für stdout
FileOpen("**", "w")  ; für stderr
Flags

Typ: Zeichenkette oder Integer

Entweder eine Zeichenkette aus Buchstaben für den gewünschten Zugriffsmodus, gefolgt von anderen Optionen (optional getrennt durch Leer- oder Tabulatorzeichen), oder eine Kombination (Summe) von numerischen Flags. Mögliche Werte finden Sie in den Tabellen unten.

Kodierung

Typ: Zeichenkette oder Integer

Wenn weggelassen, wird die Standardkodierung verwendet (definiert durch FileEncoding oder standardmäßig CP0). Wenn leer, wird standardmäßig CP0 (die Standard-ANSI-Codepage des Systems) verwendet. Andernfalls geben Sie die Kodierung oder Codepage für die Text-Ein-/Ausgabe an, z.B. "UTF-8", "UTF-16", CP936 oder 936.

Wenn die Datei eine UTF-8- oder UTF-16-Byte-Order-Markierung (BOM) enthält oder wenn das h-Flag (Handle) verwendet wird, werden dieser Parameter und die Standardkodierung ignoriert, es sei denn, die Datei wird nur mit Schreibzugriff geöffnet (d.h. der vorherige Inhalt der Datei wird verworfen).

Flags

Zugriffsmodi (schließen sich gegenseitig aus)

Flag Dez Hex Beschreibung
r 0 0x0 Read (Lesen): Schlägt fehl, wenn die Datei nicht existiert.
w 1 0x1 Write (Schreiben): Erstellt eine neue Datei, wenn sie nicht existiert, andernfalls wird die Datei überschrieben.
a 2 0x2 Append (Anfügen): Erstellt eine neue Datei, wenn sie nicht existiert, andernfalls wird der Dateizeiger an das Ende der Datei verschoben.
rw 3 0x3 Read/Write (Lesen/Schreiben): Erstellt eine neue Datei, wenn sie nicht existiert.
h     Kennzeichnet, dass DateiName ein Datei-Handle ist, das in ein Objekt gewrappt werden soll. Freigabemodusflags werden ignoriert. Die Datei oder der Stream des Handles wird nicht auf eine Byte-Order-Markierung (BOM) hin überprüft. Das Datei-Handle wird nicht automatisch geschlossen, wenn das File-Objekt zerstört wird. Der Aufruf von File.Close hat keine Wirkung. Beachten Sie, dass File.Seek, File.Pos und File.Length nicht verwendet werden sollten, wenn DateiName ein Handle ist, das auf ein nicht-suchendes Device (z.B. ein Pipe oder ein Kommunikations-Device) verweist.

Freigabemodi

Flag Dez Hex Beschreibung
-rwd     Sperrt die Datei für Lese-, Schreib- und/oder Löschzugriffe. Es sind beliebige Kombinationen von r, w und d möglich. Die Angabe von - entspricht der Angabe von -rwd. Wenn alles weggelassen wird, werden standardmäßig alle Zugriffe freigegeben.
  0 0x0 Wenn Flags numerisch ist und keine Freigabemodusflags angegeben sind, wird die Datei gesperrt.
  256 0x100 Lesezugriff freigeben.
  512 0x200 Schreibzugriff freigeben.
  1024 0x400 Löschzugriff freigeben.

Zeilenumbruchoptionen

Flag Dez Hex Beschreibung
`n 4 0x4 Ersetzt beim Schreiben `r`n mit `n und beim Lesen `n mit `r`n.
`r 8 0x8 Ersetzt beim Schreiben das alleinstehende `r mit `n.

Rückgabewert

Typ: Objekt

Der Rückgabewert ist ein neues File-Objekt, das das offene Handle zur Datei kapselt. Verwenden Sie die Methoden und Eigenschaften dieses Objekts, um auf den Inhalt der Datei zuzugreifen.

Fehlerbehandlung

Wenn die Datei nicht geöffnet werden kann, wird ein OSError ausgelöst.

Bemerkungen

File.ReadLine unterstützt immer `n, `r`n und `r als Zeilenenden, fügt sie aber nicht in den Rückgabewert ein, egal ob die Optionen `r oder `n verwendet werden oder nicht. Die Optionen beeinflussen nur die Übersetzung von Zeilenenden innerhalb eines Textes, der von File.Read zurückgegeben oder von File.Write oder File.WriteLine geschrieben wurde.

Beim Erstellen einer UTF-8- oder UTF-16-Datei wird eine Byte-Order-Markierung (BOM) in die Datei geschrieben, es sei denn, Kodierung oder die Standardkodierung (definiert durch FileEncoding) ist "UTF-8-RAW" oder "UTF-16-RAW".

Wenn eine Datei mit einer UTF-8- oder UTF-16-Byte-Order-Markierung (BOM) via Lesezugriff geöffnet wird, wird der Dateizeiger hinter die BOM gesetzt, um sie von der Ausgabe auszuschließen. Folglich kann File.Pos unmittelbar nach dem Öffnen der Datei 3 oder 2 zurückgeben.

FileEncoding, File-Objekt, FileRead

Beispiele

Schreibt etwas Text in eine Datei und liest ihn zurück in den Speicher (bietet die gleiche Funktionalität wie dieses DllCall-Beispiel).

DateiName := FileSelect("S16",, "Neue Datei erstellen:")
if (DateiName = "")
    return
try
    FileObj := FileOpen(DateiName, "w")
catch as Fehler
{
    MsgBox "Kann '" DateiName "' nicht zum Schreiben öffnen."
        . "`n`n" Type(Fehler) ": " Fehler.Message
    return
}
TestZkette := "Das ist eine Zeichenkette.`r`n"  ; Wenn eine Datei auf diese Weise geschrieben wird, sollte `r`n anstelle von `n verwendet werden, um eine neue Zeile zu beginnen.
FileObj.Write(TestZkette)
FileObj.Close()

; Die Datei wurde geschrieben, also lese ihren Inhalt zurück in den Speicher.
try
    FileObj := FileOpen(DateiName, "r-d") ; Liest die Datei ("r"), gibt alle Zugriffe außer Löschen ("-d") frei
catch as Fehler
{
    MsgBox "Kann '" DateiName "' nicht zum Lesen öffnen."
        . "`n`n" Type(Fehler) ": " Fehler.Message
    return
}
ZuLesendeZeichen := StrLen(TestZkette)
TestZkette := FileObj.Read(ZuLesendeZeichen)
FileObj.Close()
MsgBox "Die folgende Zeichenkette wurde aus der Datei gelesen: " TestZkette

Öffnet das Skript im Schreibschutzmodus und liest dessen erste Zeile.

Skript := FileOpen(A_ScriptFullPath, "r")
MsgBox Skript.ReadLine()

Zeigt die Verwendung der Standard-Eingabe/Ausgabe-Datenströme.

; Öffnet ein Konsolenfenster für diese Demonstration:
DllCall("AllocConsole")
; Öffnet die stdin/stdout-Ströme der Anwendung.
stdin  := FileOpen("*", "r")
stdout := FileOpen("*", "w")
stdout.Write("Bitte Anfrage eingeben.`n\> ")
stdout.Read(0) ; Schreibpuffer leeren.
query := RTrim(stdin.ReadLine(), "`n")
stdout.WriteLine("Die Anfrage war '" query "'. Schönen Tag noch.")
stdout.Read(0) ; Schreibpuffer leeren.
Sleep 5000