I/O庫提供兩種不同的方式進行檔案處理:
-
io表呼叫方式
使用io表,io.open將返回指定檔案的描述,並且所有的操作將圍繞這個檔案描述。io表同樣提供三種預定義的檔案描述io.stdin,io.stdout,io.stderr
-
檔案控制程式碼直接呼叫方式
即使用file:XXX()函式方式進行操作,其中file為io.open()返回的檔案控制程式碼。多數I/O函式呼叫失敗時返回nil加錯誤資訊,有些函式成功時返回nil
IO
-
io.close ([file])
-
io.flush ()
相當於file:flush(),輸出所有緩衝中的內容到預設輸出檔案
-
io.lines ([filename])
開啟指定的檔案filename為讀模式並返回一個迭代函式,每次呼叫將獲得檔案中的一行內容,當到檔案尾時,將返回nil,並自動關閉檔案,若不帶引數時io.lines() <=> io.input():lines(); 讀取預設輸入裝置的內容,但結束時不關閉檔案
for line in io.lines("main.lua") do
print(line)
end
-
io.open (filename [, mode])
mode:
”r”: 讀模式 (預設);
”w”: 寫模式;
”a”: 新增模式;
”r+”: 更新模式,所有之前的資料將被儲存
”w+”: 更新模式,所有之前的資料將被清除
”a+”: 新增更新模式,所有之前的資料將被儲存,只允許在檔案尾進行新增
”b”: 某些系統支援二進位制方式
-
io.read (…)
-
io.type (obj)
檢測obj是否一個可用的檔案控制程式碼
返回:
”file”:為一個開啟的檔案控制程式碼
”closed file”:為一個已關閉的檔案控制程式碼
nil:表示obj不是一個檔案控制程式碼
-
io.write (…)
相當於io.output():write
File
-
file:close()
當檔案控制程式碼被垃圾收集後,檔案將自動關閉。控制程式碼將變為一個不可預知的值
-
file:flush()
向檔案寫入緩衝中的所有資料
-
file:lines()
返回一個迭代函式,每次呼叫將獲得檔案中的一行內容,當到檔案尾時,將返回nil,但不關閉檔案
for line in file:lines() do body end
-
file:read(…)
按指定的格式讀取一個檔案,按每個格式函式將返回一個字串或數字,如果不能正確讀取將返回nil,若沒有指定格式將指預設按行方式進行讀取
格式:
”n”: 讀取一個數字 (“number”)
”a”: 從當前位置讀取整個檔案,若為檔案尾,則返回空字串 (“all”)
”l”: [預設]讀取下一行的內容,若為檔案尾,則返回nil (“line”)
number: 讀取指定位元組數的字元,若為檔案尾,則返回nil;如果number為0則返回空字串,若為檔案尾,則返回nil;
-
file:seek(whence)
設定和獲取當前檔案位置,成功則返回最終的檔案位置(按位元組),失敗則返回nil加錯誤資訊
引數
whence:
”set”: 從檔案頭開始
”cur”: 從當前位置開始[預設]
”end”: 從檔案尾開始
offset:預設為0
不帶引數file:seek()則返回當前位置,file:seek(“set”)則定位到檔案頭,file:seek(“end”)則定位到檔案尾並返回檔案大小
-
file:write(…)
按指定的引數格式輸出檔案內容,引數必須為字元或數字,若要輸出其它值,則需通過tostring或string.format進行轉換
例項
讀取檔案所有內容
function readfile(path)
local file = io.open(path, "r")
if file then
local content = file:read("*a")
io.close(file)
return content
end
return nil
end
寫入內容到檔案
function writefile(path, content, mode)
mode = mode or "w+b"
local file = io.open(path, mode)
if file then
if file:write(content) == nil then return false end
io.close(file)
return true
else
return false
end
end
檔案大小
-- @return : 檔案位元組數
function filesize(path)
local size = false
local file = io.open(path, "r")
if file then
local current = file:seek()
size = file:seek("end")
file:seek("set", current)
io.close(file)
end
return size
end
檔案是否存在
function fileExists(path)
local file = io.open(path, "r")
if file then
io.close(file)
return true
end
return false
end