【问题标题】:Why is lua crashing after extracting zip files?为什么解压缩zip文件后lua会崩溃?
【发布时间】:2010-05-13 21:03:16
【问题描述】:

我有以下代码,但每次到达函数末尾时都会崩溃,但它成功提取所有文件并将它们放在正确的位置。

require "zip"

function ExtractZipAndCopyFiles(zipPath, zipFilename, destinationPath)
    local zfile, err = zip.open(zipPath .. zipFilename)

    -- iterate through each file insize the zip file
    for file in zfile:files() do
        local currFile, err = zfile:open(file.filename)
        local currFileContents = currFile:read("*a") -- read entire contents of current file
        local hBinaryOutput = io.open(destinationPath .. file.filename, "wb")

        -- write current file inside zip to a file outside zip
        if(hBinaryOutput)then
            hBinaryOutput:write(currFileContents)
            hBinaryOutput:close()
        end
    end

    zfile:close()
end
-- call the function
ExtractZipAndCopyFiles("C:\\Users\\bhannan\\Desktop\\LUA\\", "example.zip", "C:\\Users\\bhannan\\Desktop\\ZipExtractionOutput\\")

为什么每次到达终点都会崩溃?

【问题讨论】:

  • 它崩溃的确切点是什么?
  • @lhf:我尝试了代码,这是 Lua 崩溃的原因:“lua.exe 已停止工作”-“在线检查解决方案/关闭程序/调试程序”。所以,从字面上看,Lua 崩溃了。
  • 有时堆栈跟踪在这种情况下有很大帮助。我认为即使在 Windows 上,您也可以从“程序崩溃”对话框的深处提取它。

标签: lua zip extraction


【解决方案1】:

也许您需要在每次迭代中在currFile:read() 之后调用currFile:close()

【讨论】:

  • 垃圾收集器不应该处理这个吗?
  • 道格·柯里是绝对正确的。请把他的答案标记为正确。我刚刚通过在调用 currFile:read() 的行之后的换行符上插入 currFile:close() 来测试它,现在它可以正常工作而不会崩溃。多棒的眼睛,道格!我故意发表评论而不是回复,以便您获得应得的荣誉。另外,Brian,仅供参考,您可能知道您现在拥有的代码不会将文件解压缩到 zip 文件的文件夹中。
  • 我确实认为这个错误没有得到更优雅的处理有点令人失望。崩溃 lua.exe 有点过分了。如果我们没有道格,我们将无法解决这个问题。
  • 您应该向您使用的“zip”模块的作者报告该错误。
  • Lua 对新程序员来说非常直观和容易。我正在尝试为非编程测试人员(不像我自己)寻找一种编程语言来轻松创建自动化测试。看来我可能不得不去别处看看了。
【解决方案2】:

问题在于 LuaZip 不会遍历所有打开的内部文件并在关闭包含它们的打开的 zip 文件之前关闭它们。因此,当垃圾收集器试图关闭已经从它们下面拉出地毯的内部文件时,系统会崩溃。因此,只需删除 zfile:close() 行也将修复此崩溃,因为垃圾收集器将以相反的分配顺序释放 userdata

在提交补丁之前,我想与 Danilo、Andre 和 Tomas 讨论可能的解决方案,因为需要做出一些设计决策。例如,如果在客户端代码关闭 zip 文件时打开了内部文件,您是否会保持 zip 文件打开直到所有内部文件都被释放或使对每个内部文件的打开引用无效?也许应该不理会它,并且应该指示用户 (a) 让垃圾收集器处理关闭所有内部和 zip 文件或 (b) 在关闭包含的 zip 文件之前明确关闭所有内部文件。

【讨论】:

  • 就个人而言,我会说你必须安排一些事情,以便 GC 不会导致出现 Windows 异常终止对话框,几乎不管你的调用者对你做了什么古怪的事情。
猜你喜欢
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多