2010-05-13 5 views
6

Comment extraire des fichiers en utilisant Lua?Comment extraire des fichiers d'un fichier zip en utilisant Lua?

Mise à jour: J'ai maintenant le code suivant, mais il se bloque chaque fois qu'il atteint la fin de la fonction, mais il extrait avec succès tous les fichiers et les place au bon endroit.

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

Pourquoi planter à chaque fois qu'il arrive à la fin?

Répondre

7

Réponse courte:

LuaZip est une bibliothèque légère Lua d'extension utilisé pour lire les fichiers stockés dans des fichiers zip. L'API est très similaire à l'API de bibliothèque d'E/S Lua standard.

Utilisez LuaZip pour lire les fichiers de l'archive, puis les écrire dans le système de fichiers en utilisant le Lua io module. Si vous avez besoin d'opérations de système de fichiers non prises en charge par ANSI C, consultez LuaFileSystem. LuaFileSystem est une bibliothèque Lua développée pour compléter l'ensemble des fonctions liées aux systèmes de fichiers offerts par la distribution Lua standard. LuaFileSystem offre un moyen portable d'accéder à la structure de répertoire sous-jacente et aux attributs de fichier.


Pour en savoir plus:

LAR est un système de fichiers virtuel pour Lua en utilisant la compression ZIP.

Si vous avez besoin de lire gzip flux ou gzippé tar files alors jetez un oeil à gzio. Le module d'E/S de fichier Lua gzip émule le module d'E/S standard, mais fonctionne sur des fichiers au format gzip compressé.

+0

Je ne crois pas que cela fonctionnera. Je veux vraiment extraire les fichiers dans le zip, pas seulement voir les fichiers dans le zip. –

+0

L'extraction est le processus de lecture de l'archive et d'écriture dans le système de fichiers. Avez-vous besoin d'instructions pour écrire dans votre système de fichiers? Si oui, veuillez voir les modules Lua 'io' et' os'. –

+0

Donc je devrais lire et écrire chaque fichier? Peut-être que je ferais mieux de faire un appel système Windows pour décompresser les fichiers. –

2

Il semble que vous ayez oublié de fermer currFile dans la boucle. Je ne sais pas pourquoi il se bloque: peut-être un code de gestion des ressources bâclée ou l'épuisement des ressources (le nombre de fichiers que vous pouvez ouvert peut être limité) ...

Quoi qu'il en soit le bon code est:

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

Le dépôt "lua-compress-deflatelua" sur GitHub, par "davidm", implémente l'algorithme Gzip en plaine Lua. Lien: https://github.com/davidm/lua-compress-deflatelua (Les fichiers sont dans le répertoire LMOD.)

Exemple d'utilisation:

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