2010-05-13 18 views
6

¿Cómo extracto archivos usando Lua?¿Cómo extraer archivos de un archivo zip usando Lua?

Actualización: ahora tengo el siguiente código pero se cuelga cada vez que llega al final de la función, pero extrae con éxito todos los archivos y los coloca en la ubicación correcta.

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

¿Por qué se cuelga cada vez que se llega al final?

Respuesta

7

respuesta corta:

LuaZip es una biblioteca Lua ligera extensión se utiliza para leer los archivos almacenados en archivos zip. La API es muy similar a la API de biblioteca Lua I/O estándar.

Use LuaZip para leer archivos del archivo y luego escríbalos en el sistema de archivos usando el Lua io module. Si necesita operaciones del sistema de archivos que no son compatibles con ANSI C, eche un vistazo al LuaFileSystem. LuaFileSystem es una biblioteca Lua desarrollada para complementar el conjunto de funciones relacionadas con los sistemas de archivos ofrecidos por la distribución estándar de Lua. LuaFileSystem ofrece una forma portátil de acceder a la estructura de directorios subyacente y a los atributos de archivo.


Más información:

LAR es un sistema de archivos virtual para LUA utilizando la compresión ZIP.

Si usted necesita leer gzip corrientes o gzip tar files continuación, echar un vistazo a gzio. El módulo de E/S del archivo Lua gzip emula el módulo de E/S estándar, pero opera en archivos comprimidos de formato gzip.

+0

no creo que esto va a funcionar. Quiero extraer realmente los archivos dentro del zip, no solo ver los archivos dentro del zip. –

+0

La extracción es el proceso de leer desde el archivo y escribir en el sistema de archivos. ¿Necesita instrucciones sobre cómo escribir en su sistema de archivos? Si es así, consulte los módulos de Lua 'io' y' os'. –

+0

¿Tendría que leer y escribir cada archivo? Tal vez será mejor que haga una llamada al sistema de Windows para descomprimir los archivos. –

2

Parece que olvidó cerrar currFile en el bucle. No estoy seguro de por qué se bloquea: tal vez algo de código de gestión de recursos descuidado o agotamiento de recursos (el número de archivos que puede abiertas puede ser limitado) ...

De todos modos el código correcto es:

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

El repositorio "lua-compress-deflatelua" en GitHub, por "davidm", implementa el algoritmo Gzip en Lua simple. Enlace: https://github.com/davidm/lua-compress-deflatelua (Los archivos están en el directorio LMOD.)

Ejemplo de uso:

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