3

好的,我找到了以下用于使用 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

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

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)

我究竟做错了什么?谢谢!

4

2 回答 2

4

注意:示例脚本也会解压符号链接,并且会../../../../etc/passwd毫无怨言地解压。rubyzip gem 期望您进行自己的路径名清洗。

请注意,在 ruby​​zip 1.1.4 中,Zip::Zipfile已重命名为Zip::File.

于 2014-06-17T09:52:11.423 回答
3

以这种方式安装 gem 的问题在于,您正在使用以下方法向另一个进程发起攻击:

`gem install rubyzip`

并且在完成安装 gem 之后,您当前的irb会话仍然看不到它。您必须重新加载irbexec "irb"然后require 'zip'再次调用。

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

尝试这个:

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

对我来说require 'zip'工作。我有 ruby​​zip-1.1.2

现在你应该可以使用Zip

此外,该gem命令ruby​​gems。所以你不能自己安装rubygems。它应该已经安装了,但如果没有试试这个:http ://rubygems.org/pages/download

于 2014-03-18T18:00:58.433 回答