Как извлечь файлы из zip-файла с помощью Lua? - PullRequest
6 голосов
/ 13 мая 2010

Как извлечь файлы с помощью 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 ]

7 голосов
/ 13 мая 2010

Краткий ответ:

LuaZip - это облегченная библиотека Lua , используемая для чтения файлов, хранящихся в zip-файлах. API очень похож на стандартный API библиотеки ввода-вывода Lua.

Используйте LuaZip для чтения файлов из архива, а затем запишите их в файловую систему с помощью модуля Lua io . Если вам требуются операции с файловой системой, не поддерживаемые ANSI C, обратите внимание на LuaFileSystem . LuaFileSystem - это библиотека Lua, разработанная для дополнения набора функций, связанных с файловыми системами, предлагаемых стандартным дистрибутивом Lua. LuaFileSystem предлагает портативный способ доступа к базовой структуре каталогов и атрибутам файлов.


Дополнительная литература:

LAR - это виртуальная файловая система для Lua, использующая сжатие ZIP.

Если вам нужно прочитать gzip streams или gzipped tar-файлов , взгляните на gzio . Модуль ввода / вывода файлов Lua gzip эмулирует стандартный модуль ввода / вывода, но работает со сжатыми файлами формата gzip.

2 голосов
/ 21 августа 2011

Кажется, вы забыли закрыть 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
1 голос
/ 11 сентября 2012

Репозиторий "lua-compress-deflatelua" на GitHub от "davidm" реализует алгоритм Gzip на простом Lua. Ссылка: 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()
...