如何用ruby解压缩文件

时间:2014-03-18 17:41:42

标签: ruby rubyzip

好的,我发现以下代码用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

在此之上,我使用以下内容确保安装了所需的宝石。

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)

我做错了什么? 谢谢!

2 个答案:

答案 0 :(得分:3)

以这种方式安装gem的问题在于,您正在使用以下方式进行另一个进程:

`gem install rubyzip`

在完成安装宝石后,您当前的irb会话仍然无法看到它。您必须使用irb重新加载exec "irb",然后再次呼叫require 'zip'

注意:这些是反引号而不是单引号。

试试这个:

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

对我来说require 'zip'有效。我有rubyzip-1.1.2

现在您应该可以使用Zip

此外,gem命令 ruby​​gems。因此,您无法自行安装rubygems。它应该已经安装,但如果没有,请尝试:http://rubygems.org/pages/download

答案 1 :(得分:3)

注意:示例脚本也会解压缩符号链接,并且会在没有抱怨的情况下解包../../../../etc/passwd。 rubyzip gem希望你自己进行路径名洗涤。

请注意,在rubyzip 1.1.4中,Zip::Zipfile已重命名为Zip::File