Lua檔案操作


I/O庫用於讀取和操作Lua中的檔案。 Lua中有兩種檔案操作,即隱式檔案描述符和顯式檔案描述符。

對於以下範例,將使用範例檔案 - test.lua,內容如下所示 -

-- sample test.lua
-- sample2 test.lua

檔案開啟操作使用以下語句 -

file = io.open (filename [, mode])

下表列出了各種檔案模式 -

編號 模式 描述
1 r 唯讀模式,是開啟現有檔案的預設模式。
2 w 寫入啟用模式,覆蓋現有檔案或建立新檔案。
3 a 附加模式,用於開啟現有檔案或建立新檔案以進行追加。
4 r+ 現有檔案的讀寫模式。
5 w+ 如果檔案存在或建立具有讀寫許可權的新檔案,則刪除所有現有資料。
6 a+ 啟用了讀取模式的追加模式可開啟現有檔案或建立新檔案。

1. 隱式檔案描述符

隱式檔案描述符使用標准輸入/輸出模式或使用單個輸入和單個輸出檔案。 使用隱式檔案描述符的範例如下所示。

-- Opens a file in read
file = io.open("test.lua", "r")

-- sets the default input file as test.lua
io.input(file)

-- prints the first line of the file
print(io.read())

-- closes the open file
io.close(file)

-- Opens a file in append mode
file = io.open("test.lua", "a")

-- sets the default output file as test.lua
io.output(file)

-- appends a word test to the last line of the file
io.write("-- End of the test.lua file")

-- closes the open file
io.close(file)

執行程式時,將獲得test.lua 檔案第一行的輸出。執行上面程式,得到以下輸出 -

-- Sample test.lua

這是test.lua 檔案中宣告的第一行。 同時也將"-- End of the test.lua file"這一行附加到test.lua 檔案中的最後一行。

在上面的範例中,可以使用io."x"方法檢視隱式描述符如何與檔案系統一起使用。 上面的範例使用不帶可選引數的io.read()方法。可選引數可以是以麵中的任何一個。

編號 模式 描述
1 *n 從當前檔案位置讀取並返回一個數位(如果存在於檔案位置或返回nil)。
2 *a 從當前檔案位置返回檔案的所有內容。
3 *l 從當前檔案位置讀取行,並將檔案位置移動到下一行。
4 number 讀取函式中指定的位元組數。

其他常見的I/O方法包括,

  • io.tmpfile() - 返回一個臨時檔案,用於讀取和寫入,當程式退出,將刪除該檔案。
  • io.type(file) - 根據輸入檔案返回檔案,關閉檔案或nil
  • io.flush() - 清除預設輸出緩衝區。
  • io.lines(可選檔案名) - 提供迴圈疊代器的通用迴圈疊代器,迴圈遍歷檔案並最終關閉檔案,以防提供檔案名或使用預設檔案而不在迴圈結束時關閉。

2. 顯式檔案描述符

顯式檔案描述符經常使用,它允許一次操作多個檔案。 這些函式與隱式檔案描述符非常相似。 在這裡,使用file:function_name,而不是io.function_name。 下面顯示了以下相同隱式檔案描述符範例的顯式檔案描述符版本範例。

-- Opens a file in read mode
file = io.open("test.lua", "r")

-- prints the first line of the file
print(file:read())

-- closes the opened file
file:close()

-- Opens a file in append mode
file = io.open("test.lua", "a")

-- appends a word test to the last line of the file
file:write("--test")

-- closes the open file
file:close()

執行程式時,將獲得與隱式描述符範例類似的輸出 -

-- Sample test.lua

檔案開啟的所有模式和用於讀取外部描述符的引數與隱式檔案描述符相同。

其他常見的檔案方法包括,

  • file:seek(optional whence, optional offset) - 引數是setcurend。 使用檔案開頭的更新檔案位置設定新檔案指標。 在此函式中,偏移量為零。 如果第一個引數是set,則從檔案的開頭測量偏移量; 從檔案中的當前位置開始,如果它是cur; 或者從檔案的末尾開始,則它是end。 預設引數值為cur0,因此可以通過不帶引數呼叫此函式來獲取當前檔案位置。

  • file:flush() ? 清除預設輸出緩衝區。

  • io.lines(optional file name) - 提供迴圈疊代器的通用迴圈疊代器,迴圈遍歷檔案並最終關閉檔案,以防提供檔案名或使用預設檔案而不在迴圈結束時關閉。

使用搜尋方法的範例如下所示。它將游標從檔案結束前的25個位置偏移。 read函式從搜尋位置列印檔案的剩餘部分。

-- Opens a file in read
file = io.open("test.lua", "r")

file:seek("end",-25)
print(file:read("*a"))

-- closes the opened file
file:close()

執行上面範例程式碼,將獲得類似於以下內容的輸出 -

sample2 test.lua
--test

讀者可自己使用所有的模式和引數來了解Lua檔案操作的完整功能。