为什么lua在解压缩zip文件后崩溃?

为什么lua在解压缩zip文件后崩溃?,lua,zip,extraction,Lua,Zip,Extraction,我有以下代码,但每次到达函数末尾时它都会崩溃,但它成功地提取了所有文件并将它们放在正确的位置 require "zip" function ExtractZipAndCopyFiles(zipPath, zipFilename, destinationPath) local zfile, err = zip.open(zipPath .. zipFilename) -- iterate through each file insize the zip file for

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

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\\")

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

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

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

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

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\\")

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

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

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\\")


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

垃圾收集器不应该处理这个问题吗?Doug Currie是绝对正确的。请把他的回答记为正确。我刚刚通过在调用currFile:read()的行之后的换行中插入currFile:close()对其进行了测试,现在它可以正常工作而不会崩溃。多漂亮的眼睛啊,道格!我是有目的的评论而不是回复,这样你就可以得到你应得的荣誉。另外,Brian,仅供参考,因为您可能知道现在的代码无法将文件解压缩到zip文件中的文件夹中。我确实认为这个错误没有得到更优雅的处理有点令人失望。崩溃lua.exe有点太多了。如果我们没有Doug,我们就没有办法解决这个问题。你应该向你使用的“zip”模块的作者报告这个错误。Lua对新程序员来说是直观和简单的。我试图为非编程测试人员(不像我自己)找到一种编程语言,以便轻松创建自动化测试。看来我得找别的地方了。垃圾回收员不应该处理这个问题吗?道格·柯里是绝对正确的。请把他的回答记为正确。我刚刚通过在调用currFile:read()的行之后的换行中插入currFile:close()对其进行了测试,现在它可以正常工作而不会崩溃。多漂亮的眼睛啊,道格!我是有目的的评论而不是回复,这样你就可以得到你应得的荣誉。另外,Brian,仅供参考,因为您可能知道现在的代码无法将文件解压缩到zip文件中的文件夹中。我确实认为这个错误没有得到更优雅的处理有点令人失望。崩溃lua.exe有点太多了。如果我们没有Doug,我们就没有办法解决这个问题。你应该向你使用的“zip”模块的作者报告这个错误。Lua对新程序员来说是直观和简单的。我试图为非编程测试人员(不像我自己)找到一种编程语言,以便轻松创建自动化测试。看起来我可能得去别处看看。它崩溃的确切点是什么?@lhf:我试过代码,下面是Lua崩溃的方式:“Lua.exe已经停止工作”-“联机检查解决方案/关闭程序/调试程序”。所以,从字面上说,Lua崩溃了。有时候,堆栈跟踪在这种情况下非常有用。我认为,即使在Windows上,您也可以从“程序崩溃”对话框的深处提取它。它崩溃的确切点是什么?@lhf:我尝试了代码,下面是Lua崩溃的方式:“Lua.exe已停止工作”-“联机检查解决方案/关闭程序/调试程序”。所以,从字面上说,Lua崩溃了。有时候,堆栈跟踪在这种情况下非常有用。我认为,即使在Windows上,你也可以从“程序崩溃”对话框的深处提取它。就我个人而言,我认为你必须安排一些事情,以便GC不会导致Windows异常终止对话框出现,几乎不管你的来电者对你做了什么不正常的事情。就我个人而言,我想说的是,你必须安排一些事情,这样GC就不会导致Windows异常终止对话框出现,几乎不管你的调用者对你做了什么不正常的事情。