Lua - io.open()最多只有2 GB?

sil*_*ent 6 windows file-io lua

我使用Lua脚本来确定文件大小:

local filesize=0
local filePath = "somepath.bin"
local file,msg = io.open(filePath, "r")
if file then
    filesize=file:seek("end")
    file:close()
    filePresent = true
end
Run Code Online (Sandbox Code Playgroud)

但是,这似乎只适用于高达2GB的文件.对于较大的文件filesize总是如此nil.有没有限制io.open?如果是这样,我怎么能解决这个问题呢?

在Windows Server 2008 R2 64位上运行Lua 5.1.4

Yu *_*Hao 5

问题不在于io.open,但是file:seek.您可以像这样检查错误:

filesize, err = file:seek("end")
if not filesize then
    print(err)
end
Run Code Online (Sandbox Code Playgroud)

可能是错误消息Invalid argument.这是因为对于大于2GB的文件,其大小超过了32位long可以容纳的大小,这导致C函数fseek无法工作.

在POSIX系统中,Lua使用的fseeko是大小off_t而不是longin fseek.在Windows中,_fseeki64我猜有类似的工作.如果这些不可用,fseek则使用,这将导致问题.


相关来源是liolib.c(Lua 5.2).正如@lhf指出的那样,在Lua 5.1中,fseek总是使用().升级到Lua 5.2可能会解决问题.


sif*_*joe 3

在内部,Lua 使用 ISO C 函数long int ftell(FILE *stream);来确定 的返回值file:seek()。Along int在 Windows 上始终是 32 位,所以你在这里运气不好。如果可以的话,您应该使用一些外部库来检测文件大小 - 我推荐luafilesystem