我有以下代码,但每次到达函数末尾时都会崩溃,但它会成功提取所有文件并将它们放在正确的位置。
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\\")
为什么每次到达时都会崩溃?
答案 0 :(得分:2)
也许您需要在每次迭代中currFile:close()
之后调用currFile:read()
?
答案 1 :(得分:2)
问题是LuaZip不会迭代所有打开的内部文件并关闭它们,然后关闭它们所包含的打开的zip文件。因此,当垃圾收集器试图关闭从其下面拉出地毯的内部文件时,系统会崩溃。因此,只需删除zfile:close()
行也可以解决此崩溃问题,因为垃圾收集器将以相反的分配顺序释放userdata
。
在提交补丁之前,我想与Danilo,Andre和Tomas讨论可能的解决方案,因为需要做出一些设计决策。例如,如果在客户端代码关闭zip文件时打开了内部文件,您是否保持zip文件处于打开状态,直到所有内部文件都被释放或者对每个内部文件的开放引用无效?也许它应该保持不变,并且应该指示用户(a)让垃圾收集器处理关闭所有内部和zip文件或(b)在关闭包含zip文件之前显式关闭所有内部文件。