打开文件, 从其中读取特定内容和/或将新内容写入其中.
FileObj := FileOpen(Filename, Flags , Encoding)
类型: 字符串或整数
要打开文件的路径, 如果未指定绝对路径则假定在 A_WorkingDir 中.
如下所示, 指定一个(或两个) 星号来打开标准输入(input)/输出(output)/错误(error) 流:
FileOpen("*", "r") ; 标准输入 FileOpen("*", "w") ; 标准输出 FileOpen("**", "w") ; 标准错误
类型: 字符串
表示所需的访问模式的字符串, 后面跟着其他选项(中间有可选的空格或制表符); 或数字标志的组合(总和). 支持的值在下表中描述.
如果省略, 将使用默认编码(由 FileEncoding 或 CP0 设置). 如果为空, 则默认为 CP0(系统默认的 ANSI 代码页). 否则, 指定用于文本 I/O 的编码或代码页, 例如 "UTF-8", "UTF-16", "CP936" 或 936.
"UTF-8"
"UTF-16"
"CP936"
936
如果文件包含 UTF-8 或 UTF-16 字节顺序标记(BOM), 或者如果使用 h(句柄) 标记, 则该参数和默认编码将被忽略, 除非文件以只写访问方式打开(即文件的先前内容被丢弃).
h
r
w
d
-
-rwd
`r`n
`n
`r
类型: Object
返回值是一个封装文件打开句柄的新文件对象. 使用此对象的方法和属性来访问文件的内容.
如果文件不能打开, 则抛出 OSError.
File.ReadLine 始终支持 `n, `r`n 和 `r 作为行结束符, 并且不将它们包含在返回值中, 无论是否使用 `r 或 `n 选项. 这些选项仅影响 File.Read 返回的或由 File.Write 或 File.WriteLine 写入的文本中的行结束符的转换.
当创建 UTF-8 或 UTF-16 文件时, 会写入字节顺序标记(BOM) 到文件中, 除非 Encoding 或默认编码(由 FileEncoding 设置) 是 "UTF-8-RAW" 或 "UTF-16-RAW".
"UTF-8-RAW"
"UTF-16-RAW"
当以读取方式打开含有 UTF-8 或 UTF-16 字节顺序标记(BOM) 的文件时, 会把文件指针放置到这个标志后, 来从输出中排除 BOM. 因此, 在刚刚打开这样的文件时 File.Pos 可能为 3 或 2.
FileEncoding, 文件对象, FileRead
写入一些文本到文件, 然后从文件读取回内存(它提供了与这个 DllCall 示例相同的功能).
FileName := FileSelect("S16",, "Create a new file:") if (FileName = "") return try FileObj := FileOpen(FileName, "w") catch as Err { MsgBox "Can't open '" FileName "' for writing." . "`n`nError " Err.Extra ": " Err.Message return } TestString := "This is a test string.`r`n" ; 通过这种方式写入内容到文件时, 要使用 `r`n 而不是 `n 来开始新行. FileObj.Write(TestString) FileObj.Close() ; 现在已经把内容写入文件了, 把它们读取回内存中. try FileObj := FileOpen(FileName, "r-d") ; 读取文件 ("r"), 共享除了删除 ("-d") 外的所有访问权限 catch as Err { MsgBox "Can't open '" FileName "' for reading." . "`n`n" Type(Err) ": " Err.Message return } CharsToRead := StrLen(TestString) TestString := FileObj.Read(CharsToRead) FileObj.Close() MsgBox "The following string was read from the file: " TestString
以只读模式打开脚本并读取它的首行.
Script := FileOpen(A_ScriptFullPath, "r") MsgBox Script.ReadLine()
演示标准 input/output 流的用法.
; 打开控制台窗口以进行此次演示: DllCall("AllocConsole") ; 打开应用程序的 stdin/stdout 流. stdin := FileOpen("*", "r") stdout := FileOpen("*", "w") stdout.Write("Enter your query.`n\> ") stdout.Read(0) ; 清除写入缓冲区. query := RTrim(stdin.ReadLine(), "`n") stdout.WriteLine("Your query was '" query "'. Have a nice day.") stdout.Read(0) ; 清除写入缓冲区. Sleep 5000