22

我正在尝试读取完整的 mp3 文件以读出 id3 标签。那时我注意到 file:read("*a") 显然没有读取完整文件,而是读取一小部分。因此,我尝试构建某种解决方法以获取整个文件的内容:

function readAll(file)
    local f = io.open(file, "r")
    local content = ""
    local length = 0

    while f:read(0) ~= "" do
        local current = f:read("*all")

        print(#current, length)
        length = length + #current

        content = content .. current
    end

    return content
end

对于我的测试文件,这表明执行了 256 次读取操作,总共读取了 ~113kB(整个文件为 ~7MB)。虽然这应该足以读取大多数 id3 标签,但我想知道为什么 Lua 会以这种方式运行(尤其是因为它在读取大型文本文件(如 *.obj 或 *.ase)时不会这样做)。对此行为是否有任何解释,或者是否有可靠读取整个文件的解决方案?

4

1 回答 1

64

我一定遗漏了一些东西,但我看不出为什么需要循环。这应该可以工作(但你最好添加错误处理以防文件无法打开):

function readAll(file)
    local f = assert(io.open(file, "rb"))
    local content = f:read("*all")
    f:close()
    return content
end
于 2012-04-30T17:32:21.687 回答