2010-05-13 18 views
6

nasıl Lua kullanarak dosyaları ayıklamak?Lua kullanarak bir zip dosyasından dosya nasıl çıkartılır?

Güncelleme: Şimdi aşağıdaki kodu var ama buna fonksiyonun sonuna geldiğinde her zaman çöker, ancak başarılı tüm dosyaları ayıklar ve doğru yerde koyar.

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\\") 
Neden buna sonuna geldiğinde her zaman çökmesine yok

?

cevap

7

Kısa Cevap:

LuaZip zip dosyaları içinde saklanan dosyaları okumak için kullanılan hafif Lua uzatma kütüphanesidir. API, standart Lua I/O kütüphane API'sine çok benzemektedir.

Kullanım LuaZip arşivinden dosyalarını okumak ve sonra Lua io module kullanarak dosya sistemi bunları yazmak için. Eğer ANSI C tarafından desteklenmeyen dosya sistemi işlemlerini gerektiriyorsa, o zaman LuaFileSystem bakabilirsiniz. LuaFileSystem, standart Lua dağıtımı tarafından sunulan dosya sistemleriyle ilgili işlev setini tamamlamak için geliştirilmiş bir Lua kütüphanesidir. LuaFileSystem, temel dizin yapısına ve dosya özniteliklerine erişmek için taşınabilir bir yol sunar.


fazla okuma:

LAR ZIP sıkıştırma kullanarak Lua için sanal bir dosya sistemidir.

gzip akışlarını veya gzipped tar files'u okumanız gerekiyorsa, gzio'a bakın. Lua gzip dosyası G/Ç modülü standart G/Ç modülünü öykünür, ancak sıkıştırılmış gzip biçiminde dosyalar üzerinde çalışır.

+0

Bu çalışır inanmıyorum. Dosyalari zip içindeki dosyalari ayirmak istiyorum, yalnizca zip içindeki dosyalari degil. –

+0

Ekstraksiyon, arşivden okuma ve dosya sistemine yazma işlemidir. Dosya sisteminize yazma konusunda eğitime ihtiyacınız var mı? Eğer öyleyse, lütfen Lua 'io' ve os' modüllerine bakın. –

+0

Her dosyayı okumak ve yazmak zorundayım? Belki de dosyaları açmak için bir pencere sistem çağrısı yapmaktan daha iyi olacağım. –

2

döngü içinde currFile kapatmayı unuttuğunu görünüyor. Ben çöküyor neden emin değilim: belki bazı özensiz kaynakları yönetimi kodu veya kaynak tükenme (eğer sınırlı olabilir açılmış dosyaların sayısı) ...

neyse doğru kod şudur:

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

"DavidM" ile GitHub'dan "lua sıkıştırmak-deflatelua" depo, düz Lua gzip algoritması uygular. Bağlantı: https://github.com/davidm/lua-compress-deflatelua (dosyalar lmod dizinde bulunmaktadır.)

Örnek kullanım:

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() 
İlgili konular