2014-03-18 43 views
3

好吧我找到了下面的代碼來用Ruby解壓縮文件。如何用ruby解壓縮文件

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

在此之上,我使用以下內容來確保安裝所需的gems。

begin 
    require 'rubygems' 
rescue LoadError 
    'gem install rubygems' 
end 
begin 
    require 'zip/zip' 
rescue LoadError 
    'gem install rubyzip' 
end 

所以,當我打電話unzip_file我得到以下錯誤:

in `unzip_file': uninitialized constant Zip (NameError) 

我在做什麼錯? 謝謝!

+0

只要試一下':: Zip :: ZipFile.open(file_path)..' –

+0

「gem install ruby​​gems」然後就有光了。 – DiegoSalazar

+0

如果一個Ruby腳本自己開始安裝gem,我會感到非常驚訝。最好簡單地放棄LoadError,然後大叫用戶自己安裝gem。 – Max

回答

3

與安裝的寶石,這樣的問題是,你炮擊了另一種方法的使用:

`gem install rubyzip` 

,之後完成安裝寶石,你當前irb會議仍然不會看到它。您必須重新加載irbexec "irb",然後再次呼叫require 'zip'

注意:那些反引號不是單引號。

試試這個:

begin 
    require 'zip' 
rescue LoadError 
    `gem install rubyzip` 
    exec "irb" 
    retry 
end 

對我來說require 'zip'作品。我已經rubyzip-1.1.2

現在,你應該能夠使用Zip

此外,gem命令 RubyGems的。所以你不能自己安裝rubygems。它應該已經安裝,但如果不嘗試:http://rubygems.org/pages/download

3

請注意:示例腳本還會解壓符號鏈接,並且會在不抱怨的情況下解壓縮../../../../etc/passwd。 rubyzip寶石希望你做自己的路徑名洗錢。

請注意,在rubyzip 1.1.4中,Zip::Zipfile更名爲Zip::File