如何使用Lua提取文件?
更新:我现在拥有以下代码,但每次到达函数末尾时都会崩溃,但它会成功提取所有文件并将它们放在正确的位置。
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 :(得分:7)
简答:
LuaZip是一个轻量级Lua扩展库,用于读取存储在zip文件中的文件。该API与标准的Lua I / O库API非常相似。
使用LuaZip从存档中读取文件,然后使用Lua io module将其写入文件系统。如果您需要ANSI C不支持的文件系统操作,请查看LuaFileSystem。 LuaFileSystem是一个Lua库,用于补充与标准Lua发行版提供的文件系统相关的一组功能。 LuaFileSystem提供了一种可移植的方式来访问底层目录结构和文件属性。
进一步阅读:
LAR是Lua使用ZIP压缩的虚拟文件系统。
如果您需要阅读gzip信息流或gzipped tar files,请查看gzio。 Lua gzip文件I / O模块模拟标准I / O模块,但在压缩的gzip格式文件上运行。
答案 1 :(得分:2)
似乎你忘了在循环中关闭currFile。 我不确定它崩溃的原因:可能是一些草率的资源管理代码或资源耗尽(你可以打开的文件数量可能有限)......
无论如何,正确的代码是:
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
currFile.close()
end
zfile:close()
end
答案 2 :(得分:1)
GitHub上的“lua-compress-deflatelua”存储库由“davidm”实现了普通Lua中的Gzip算法。链接:https://github.com/davidm/lua-compress-deflatelua(文件位于lmod目录中。)
使用示例:
local DEFLATE = require 'compress.deflatelua'
-- uncompress gzip file
local fh = assert(io.open('foo.txt.gz', 'rb'))
local ofh = assert(io.open('foo.txt', 'wb'))
DEFLATE.gunzip {input=fh, output=ofh}
fh:close(); ofh:close()