[基礎] AHK 中讀寫文件的方法

讀寫文件是很常用的操作,本文簡單介紹 AHK 中讀寫文件的方法。可以使用命令和函數兩種方式讀寫文件,二者各有所長,所以分別介紹一下。

命令方式

使用命令寫入和讀取文件比較方便,但如果頻繁調用,性能較差。

寫入文件

FileAppend 命令用于寫入文件,當文件不存在時會先創建文件。

FileAppend [, Text, Filename, Encoding]

這個命令用起來很方便,Text 即要寫入的內容,如果 Text 為空,那么如果文件不存在,會創建空文件,如果文件已經存在,則只更新文件的修改時間。Filename 為文件名,如果 Filename 不包含絕對路徑,那么就是在 A_WorkingDir 目錄下。Encoding 是文件的編碼,默認是 FileEncoding 命令指定的編碼。

FileEncoding [, Encoding]

常用的有以下幾個:

  1. UTF-8。帶 BOM 的 UTF-8。
  2. UTF-8-RAW。不帶 BOM 的 UTF-8。
  3. CP936。GBK 編碼對應的代碼頁。
  4. ANSI。系統默認的代碼頁,對于中文的 Windows 系統,即 CP936。
  5. UTF-16。帶 BOM 的小端 UTF-16。
  6. UTF-16-RAW。不帶 BOM 的小端 UTF-16。

如果也沒用 FileEncoding 指定編碼,那么默認是 ANSI 編碼(也可以在用 AutoHotkey.exe 運行腳本時加參數指定,不推薦使用)。

如果對這些編碼沒概念,建議使用 UTF-8,比較通用,在 Windows 下用記事本打開也顯示正常。如果不需要記事本打開后顯示正常,推薦使用 UTF-8-RAW,兼容性好,方便處理。如果需要盡量減少文件體積,可以使用 CP936。盡量不要使用 ANSI,以免在其他語言的系統出問題。非特殊情況,不建議使用 UTF-16 系列編碼,以免衍生各種問題。

如果文件中有內容,并且文件是帶 BOM 的 UTF-8 或 UTF-16 編碼,那么即使不指定編碼,也會使用對應編碼寫入文件。

如果文件不存在,并且指定了帶 BOM 的 UTF-8 或 UTF-16 編碼,那么將創建的文件并不是空文件,而是帶了對應的 BOM。所以如果要創建一個空文件,可以使用:

FileAppend, , Filename, UTF-8-RAW

如果往標準輸出(stdout)寫內容,Filename 填寫 * 即可。

FileAppend, Text, *

FileAppend 命令還有一些其他細節,比如換行符的問題,可以直接參考幫助文檔。

讀取文件

讀取文件比寫入文件復雜。

FileRead 命令用于讀取文件的全部內容(也可用參數指定大小)。

FileRead, OutputVar, Filename

Filename 中可以指定一些參數,用于指定讀取內容的大小、指定編碼、是否轉換換行符等。

FileReadLine 命令用于讀取文件的某一行。

FileReadLine, OutputVar, Filename, LineNum

除了使用 FileRead 和 FileReadLine 命令,還可以用 Loop, Read 從頭一行一行讀取文件,效率要比 FileReadLine 高。

Loop, Read, InputFile [, OutputFile]

循環中使用 A_LoopReadLine 變量訪問讀取到的一行內容。如果指定了 OutputFile,那么在循環中用 FileAppend 不指定文件名則會直接寫入該文件。

Loop, Read, C:\Docs\Address List.txt, C:\Docs\Family Addresses.txt
{
    IfInString, A_LoopReadLine, family, FileAppend, %A_LoopReadLine%`n
}

函數方式

這里只簡單列出相關函數,細節請參考幫助文檔(搜 File object)。

打開文件

File := FileOpen(Filename, Flags [, Encoding])

寫入內容

; 寫入內容
File.Write(String)
; 按行寫入內容
File.WriteLine([String])
; 寫入特定類型數據
File.WriteNumType(Num)
; 寫入原始格式數據
File.RawWrite(VarOrAddress, Bytes)

讀取內容

; 讀取內容
String := File.Read([Characters])
; 讀取一行內容
Line := File.ReadLine()
; 讀取特定類型數據
Num := File.ReadNumType()
; 讀取原始格式數據
File.RawRead(VarOrAddress, Bytes)

其他操作

; 移動文件指針
File.Seek(Distance [, Origin = 0])
File.Position := Distance
File.Pos := Distance

; 獲取文件指針的當前位置
Pos := File.Tell()
Pos := File.Position
Pos := File.Pos

; 獲取和設置文件的大小
FileSize := File.Length
File.Length := NewSize

; 判斷文件指針是否到達文件末尾
IsAtEOF := File.AtEOF

; 關閉文件
File.Close()

; 獲取或設置文件編碼
Encoding := File.Encoding
File.Encoding := Encoding

; 獲取文件句柄
File.__Handle

付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活定價,歡迎咨詢,微信 ly50247。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容