FileOpen() [AHK_L 42+]

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

File := FileOpen(DateiName, Flags , Kodierung)

Parameter

DateiName

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

[v1.1.17+]: 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

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

Kodierung

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.Tell 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

Wenn die Datei erfolgreich geöffnet wurde, wird ein File-Objekt zurückgegeben.

Wenn die Funktion fehlschlägt, wird 0 zurückgegeben und in [AHK_L 54+] A_LastError auf einen Fehlercode gesetzt.

Mit if File oder IsObject(File) können Sie prüfen, ob die Funktion erfolgreich war.

Bemerkungen

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).

FileSelectFile, DateiName, S16,, Neue Datei erstellen:
if (DateiName = "")
    return
File := FileOpen(DateiName, "w")
if !IsObject(File)
{
    MsgBox Kann "%DateiName%" nicht zum Schreiben öffnen.
    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.
File.Write(TestZkette)
File.Close()

; Die Datei wurde geschrieben, also lese ihren Inhalt zurück in den Speicher.
File := FileOpen(DateiName, "r-d") ; Liest die Datei ("r"), gibt alle Zugriffe außer Löschen ("-d") frei
if !IsObject(File)
{
    MsgBox Kann "%DateiName%" nicht zum Lesen öffnen.
    return
}
ZuLesendeZeichen := StrLen(TestZkette)
TestZkette := File.Read(ZuLesendeZeichen)
File.Close()
MsgBox Die folgende Zeichenkette wurde aus der Datei gelesen: %TestZkette%

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

File := FileOpen(A_ScriptFullPath, "r")
MsgBox % File.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 im "`n"-Modus.
stdin  := FileOpen("*", "r `n")  ; Benötigt [v1.1.17+]
stdout := FileOpen("*", "w `n")
; Für ältere Versionen:
;   stdin  := FileOpen(DllCall("GetStdHandle", "int", -10, "ptr"), "h `n")
;   stdout := FileOpen(DllCall("GetStdHandle", "int", -11, "ptr"), "h `n")
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