代码之家  ›  专栏  ›  技术社区  ›  Brian T Hannan

如何使用lua从zip文件中提取文件?

  •  6
  • Brian T Hannan  · 技术社区  · 14 年前

    如何使用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\\")
    

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

    3 回复  |  直到 6 年前
        1
  •  7
  •   Judge Maygarden    14 年前

    简短回答:

    LuaZip 是一个轻量级的 Lua 扩展库用于读取存储在zip文件中的文件。该API与标准Lua I/O库API非常相似。

    使用luazp从存档中读取文件,然后使用 Lua io module . 如果您需要ANSI C不支持的文件系统操作,请看一下 LuaFileSystem . LuaFileSystem是一个Lua库,它是为补充与标准Lua发行版提供的文件系统相关的一组功能而开发的。LuaFileSystem提供了一种访问底层目录结构和文件属性的可移植方法。


    进一步阅读:

    LAR 是一个使用zip压缩的Lua虚拟文件系统。

    如果你需要阅读 gzip 流或gzip tar files 那就看看 gzio . LuaGzip文件I/O模块模拟标准I/O模块,但操作压缩的Gzip格式文件。

        2
  •  2
  •   Name is carl    13 年前

    似乎你忘了关闭循环中的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
    
        3
  •  1
  •   Riking    12 年前

    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()