FileOpen() [AHK_L 42+]

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

File := FileOpen(Dateiname, Flags , Codierung)

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

Seit [AHK_L 54] entweder eine Zeichenkette mit Zeichen für den gewünschten Zugriffsmodus, gefolgt von anderen Optionen (optional getrennt durch Leerzeichen und Tabulatoren); oder in [AHK_L 42+] eine Kombination (Summe) von numerischen Flags. Unterstützte Werte werden in den folgenden Tabellen beschrieben.

Codierung

Der Zeichensatz, der zur Textverarbeitung verwendet werden soll, falls die Datei keine UTF-8- oder UTF-16-Byte-Order-Markierung enthält, oder wenn das h (Handle) benutzt wird. Lässt man diesen Parameter weg, wird der aktuelle Wert von A_FileEncoding verwendet.

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, ansonsten wird die Datei überschrieben.
a 2 0x2 Append (Anfügen): Erstellt eine neue Datei, wenn sie nicht existiert, ansonsten 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. Ignoriert Freigabemodus-Flags und verhindert, dass in der Datei oder im Stream des Handle eine Byte-Order-Markierung (BOM) gesucht wird. Das Datei-Handle wird nicht automatisch geschlossen, wenn das File-Objekt zerstört wird. Der Aufruf von Close hat keinen Effekt. Beachten Sie, dass Seek, Tell und 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 - ist das gleiche wie, als würde man -rwd angeben. Wenn alles weggelassen wird, werden standardmäßig alle Zugriffe freigegeben.
  0 0x0 Wenn Flags numerisch ist und keine Freigabemodus-Flags angegeben sind, wird die Datei gesperrt.
  256 0x100 Gibt Lesezugriff frei.
  512 0x200 Gibt Schreibzugriff frei.
  1024 0x400 Gibt Löschzugriff frei.

End-of-Line-Optionen (EOL)

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 eine 0 zurückgegeben und [in AHK_L 54+] A_LastError auf einen Fehlercode gesetzt.

Mit if File oder IsObject(File) kann man überprü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, Codierung (oder A_FileEncoding, falls Codierung weggelassen wird) enthält 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 der BOM positioniert, damit sie bei der Ausgabe nicht enthalten ist. Folglich wird File.Position unmittelbar nach Öffnen der Datei eventuell 3 oder 2 melden.

Siehe auch

FileEncoding, File-Objekt, FileRead

Beispiele

#1: Dieses Skript schreibt etwas Text in eine Datei und liest ihn zurück in den Speicher (es stellt die gleiche Funktionalität wie dieses DllCall-Beispiel bereit):

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

; Liest den Inhalt der Datei, nachdem sie geschrieben wurde, 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(TestZeichenkette)
TestZeichenkette := File.Read(ZuLesendeZeichen)
File.Close()
MsgBox Die folgende Zeichenkette wurde aus der Datei gelesen: %TestZeichenkette%

#2: Öffnet das Skript im Schreibschutzmodus und liest die erste Zeile:

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

#3: Veranschaulicht 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 mit der Option "`n".
stdin  := FileOpen("*", "r `n")  ; Benötigt [v1.1.17+]
stdout := FileOpen("*", "w `n")
; Bei älteren 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.
Abfrage := RTrim(stdin.ReadLine(), "`n")
stdout.WriteLine("Die Anfrage war '" Abfrage "'. Einen schönen Tag noch.")
stdout.Read(0) ; Schreibpuffer leeren.
Sleep 5000