lua檔案操作

RichardXG發表於2019-02-16

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