2009-06-08 15 views
7

Hedef dizinde önceden varolan veya bulunmayan birkaç dosya ile bir dosyayı açmaya çalışıyorum. Varsayılan davranış, dosya zaten varsa bir istisna atmak gibi görünüyor.Varolan dosyaların üzerine yazmak için Rubyzip lib

Dizine nasıl kopyalarım ve varolan dosyaların üzerine yazabilirim?

begin 
    Zip::ZipFile.open(source) do |zipfile| 
    dir = zipfile.dir 
    dir.entries('.').each do |entry| 
     zipfile.extract(entry, "#{target}/#{entry}") 
    end 
    end 
rescue Exception => e 
    log_error("Error unzipping file: #{local_zip} #{e.to_s}") 
end 

cevap

12

O özü() bunu zaten varsa dosya ile yapmak ne belirlemek olanak sağlayan isteğe bağlı bloğu (onExistsProc) sürer görünüyor - üzerine yazmak return true , istisna oluşturmak için yanlış. sadece var olan tüm dosyaların üzerine yazmak isteseydim

, bunu yapabilirsiniz:

zipfile.extract(entry, "#{target}/#{entry}") { true } 

daha farklı spesifik girdileri işlemek için biraz daha karmaşık mantığı yapmak istiyorsanız, bunu yapabilirsiniz:

zipfile.extract(entry, "#{target}/#{entry}") {|entry, path| some_logic(entry, path) } 

DÜZENLEME: sabit cevabı - Ingmar Hamer tarafından belirtildiği gibi, orijinal yanıtım yukarıdaki sözdizimini kullanarak beklenen bir parametre olarak bloğu geçti. cevap 2'de

özü komutu hatalıdır:

+0

Bu cevap aslında gönderildiği gibi çalışmıyor. Ingmar Hamer'ın gönderdiği cevaba bakın ve ona düzeltmesi için bir nokta verin. –

1

Düzenleme:: o önceden varsa hedef dosyayı kaldırmak Modifiye kod

İşte benim kod. Önceden var ise hedef dizini kaldırmak için değiştirilmiş kod.

require 'rubygems' 
require 'fileutils' 
require 'zip/zip' 

def unzip_file(file, destination) 
    if File.exist?(destination) then 
    FileUtils.rm_rf destination 
    end 
    Zip::ZipFile.open(file) { |zip_file| 
    zip_file.each { |f| 
    f_path=File.join(destination, f.name) 
    FileUtils.mkdir_p(File.dirname(f_path)) 
    zip_file.extract(f, f_path) 
    } 
    } 
end 

unzip_file('/path/to/file.zip', '/unzip/target/dir') 

İşte the original code from Mark Needham var:

require 'rubygems' 
require 'fileutils' 
require 'zip/zip' 

def unzip_file(file, destination) 
    Zip::ZipFile.open(file) { |zip_file| 
    zip_file.each { |f| 
    f_path=File.join(destination, f.name) 
    FileUtils.mkdir_p(File.dirname(f_path)) 
    zip_file.extract(f, f_path) unless File.exist?(f_path) 
    } 
    } 
end 

unzip_file('/path/to/file.zip', '/unzip/target/dir') 
+0

Cevabınız için teşekkürler, ancak bunun mevcut bir dosyanın üzerine yazılmayacağı anlaşılıyor. Varsa sadece atlar. – digitalsanctum

+0

... gerçekten var olan dosyaları atlıyor. Ne kadar aptalca yayınlamadan önce o özel kullanım vakasını test etmem. Özür dilerim. Önceden varsa, hedef dizini kaldıracak olan düzenlenmiş sürümümü inceleyin. – bernie

+0

Ve benim ikinci çözümüm de en uygun değildi. Tüm dizinin silinmesi muhtemelen nadiren tavsiye edilir; ama üçüncü kez bir çekicilik olduğuna inanıyorum: Yeni dosyayı yazmadan önce varsa dosyayı silmek için biraz kod ekledim. – bernie

14

Sadece başkalarının sorun kaydetmek için yakut meal o olmasını bekler, üçüncü (proc) parametresi bir ve işareti gayrimenkulünü belirtilen

{} - böyle bir yöntem çağrısından sonra ayraçlar:

zipfile.extract(entry, "#{target}/#{entry}"){ true } 

ya da (daha karmaşık mantığı gerekiyorsa)

zipfile.extract(entry, "#{target}/#{entry}") {|entry, path| some_logic(entry, path) } 

# 2'de verilen örneği kullanırsanız, "geçersiz bağımsız değişkenler (3 için 2)" hata iletisini alırsınız ...

+0

Teşekkürler. Ruby'ye yeni geldim ve kafamı bir saatliğine bu duvara çarptı. –

0

Bu link here, doğrulanmış bir çalışma örneğidir. Sadece bir 'fileutils' eklemesi gerekiyor.

İlgili konular