2010-05-13 17 views
6

Wie extrahiere ich Dateien mit Lua?Wie extrahiert man Dateien aus einer Zip-Datei mit Lua?

Update: Ich habe jetzt den folgenden Code, aber es stürzt jedes Mal ab, wenn es das Ende der Funktion erreicht, aber es extrahiert erfolgreich alle Dateien und legt sie an der richtigen Stelle.

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

Warum es jedes Mal nicht abstürzen das Ende erreicht?

Antwort

7

Kurze Antwort:

LuaZip ist eine leichte Lua Erweiterungsbibliothek verwendet, um Dateien in ZIP-Dateien gespeichert zu lesen. Die API ist der Standard-Lua-I/O-Bibliotheks-API sehr ähnlich.

Verwenden Sie LuaZip, um Dateien aus dem Archiv zu lesen, und schreiben Sie sie dann unter Verwendung der Lua io module in das Dateisystem. Wenn Sie Dateisystemoperationen benötigen, die nicht von ANSI C unterstützt werden, werfen Sie einen Blick auf LuaFileSystem. LuaFileSystem ist eine Lua-Bibliothek, die entwickelt wurde, um die Funktionen von Dateisystemen zu ergänzen, die von der Standard-Lua-Distribution angeboten werden. LuaFileSystem bietet eine portable Möglichkeit, auf die zugrunde liegende Verzeichnisstruktur und Dateiattribute zuzugreifen.


Weiterführende Literatur:

LAR ist ein virtuelles Dateisystem für Lua mit ZIP-Komprimierung.

Wenn Sie gzip Streams oder gzipped tar files lesen müssen, dann werfen Sie einen Blick auf gzio. Das Lua-Gzip-Datei-E/A-Modul emuliert das Standard-E/A-Modul, arbeitet jedoch mit komprimierten Dateien im gzip-Format.

+0

Ich glaube nicht, das wird funktionieren. Ich möchte die Dateien in der ZIP-Datei extrahieren und nicht nur die Dateien in der ZIP-Datei anzeigen. –

+0

Extraktion ist der Prozess des Lesens aus dem Archiv und Schreiben in das Dateisystem. Brauchen Sie Anweisungen zum Schreiben in Ihr Dateisystem? Wenn ja, sehen Sie sich bitte die Module Lua 'io' und' os' an. –

+0

Also müsste ich jede Datei lesen und schreiben? Vielleicht ist es besser, wenn ich einen Windows-Systemaufruf mache, um die Dateien zu entpacken. –

2

Es scheint, dass Sie vergessen haben, currFile in der Schleife zu schließen. Ich bin mir nicht sicher, warum es stürzt ab: vielleicht einige schlampig Ressourcen-Management-Code oder Ressourcenerschöpfung (die Anzahl der Dateien, die Sie geöffnet können beschränkt werden kann) ...

Auf jeden Fall der richtige Code ist:

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

Das Repository "lua-compress-deflatelua" auf GitHub von "davidm" implementiert den Gzip-Algorithmus in reinem Lua. Link: https://github.com/davidm/lua-compress-deflatelua (Die Dateien sind im LMOD-Verzeichnis.)

Beispiel Nutzung:

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