【问题标题】:Error with seek function in big files大文件中的查找功能错误
【发布时间】:2013-04-22 02:39:23
【问题描述】:

我有一个关于 lua 和 io 库的问题。

我有这个简单的函数来获取文件大小:

function checkisoLIMG(file)
    local iso = assert(io.open(file, "rb"));
    if (iso) then
        local size = iso:seek("end");
        iso:close();
        return size;
    else
        return "error";
    end
end

当我尝试获取大文件的大小(大约 3GB 或 4GB)时,函数返回 nil 或 -1,但小文件可以正常工作。有人知道如何解决这个问题吗?或任何脚本来获取文件大小。

问题是 io.seek,因为程序打开文件没有问题,我可以寻找低于 2147483647 的位置(仅比 2GB 少 1 个字节),但是当我尝试查看 2GB 或更大的位置时失败.

提前致谢

【问题讨论】:

    标签: lua


    【解决方案1】:

    这取决于 Lua 版本和操作系统。

    -- Program
    print(io.open[[D:\_Best Films\The Grudge 1,2\Proklyatie.2004.x264.BDRip.720p.mkv]]:seek'end')
    
    -- Output on Lua 5.2.1 / Windows
    5706609998
    
    -- Output on Lua 5.1.4 / Windows
    nil     Invalid argument        22
    

    对于这个问题没有纯粹的 Lua 解决方法。

    【讨论】:

    • 程序使用Lua 5.1.4引擎,可能是这个问题...我会尝试制作一个dll来完成这项工作。
    【解决方案2】:

    我不知道是什么导致了代码中的特定错误,但如果我想知道文件的大小,我会使用 LuaFilesystem 库。它不是基本 Lua 标准库的一部分,但它是我所知道的最常用的文件系统库。它与 LuaForWindows 发行版捆绑在一起,也很容易与 Luarocks 一起安装。

    local lfs = require 'lfs'
    
    function getFileSize(filename)
       local attrs = lfs.attributes(filename)
       if not attrs then error("File not found") end
       return attrs.size
    end
    

    【讨论】:

    • 感谢您的回复,但我正在使用一个使用 lua 作为脚本语言的程序,我无法安装第三方库。
    • @DanielCarrascoMarín:那么也许您可以使用特定于系统的解决方案而不是跨平台库。 os.execute 命令可用于运行其他程序,并且根据您的系统配置方式,也许有一些可用的功能可以满足您的需求。
    • 我在我使用的程序中找到了一种使用lfs的方法,但是我想读取最后16KB的文件,如果没有io.open和seek,我不知道该怎么做。我没有看到如何使用 lfs。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多