【问题标题】:Reading whole files in Lua在 Lua 中读取整个文件
【发布时间】:2012-05-10 07:53:55
【问题描述】:

我正在尝试读取完整的 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)时不会这样做)。对此行为是否有任何解释,或者是否有可靠读取整个文件的解决方案?

【问题讨论】:

  • 你在windows上吗?确保以二进制模式打开文件(“rb”到 io.open)
  • 啊,这就是重点。以前从未使用过二进制模式。非常感谢!
  • 有人能解释一下函数f:read("*all")中的格式*all吗?似乎 "*all" 等于 "*a" ?我在 lua 手册中找不到文档lua.org/manual/5.1/manual.html#pdf-file:read
  • @liuhao 前两个字符(*a)之后的所有字符都被忽略,根据这个答案:stackoverflow.com/questions/47277203/…我想我是从这章在 pil 回来的日子里得到的:@987654323 @,优点是(我猜)你不必记住*a*n*l 代表什么,因为你可以把它写出来。

标签: io lua


【解决方案1】:

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

function readAll(file)
    local f = assert(io.open(file, "rb"))
    local content = f:read("*all")
    f:close()
    return content
end

【讨论】:

  • 从我的问题的 cmets 中可以看出,@daurnimator 已经发现问题是缺少 b,但无论如何感谢您的回答 :) 编辑:我将您的答案标记为按顺序接受向人们展示我的问题已经解决。
猜你喜欢
  • 2014-09-12
  • 2015-06-21
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2016-05-20
  • 2010-11-20
相关资源
最近更新 更多