好的,我发现以下代码用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)
我做错了什么? 谢谢!
答案 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
命令是 rubygems。因此,您无法自行安装rubygems。它应该已经安装,但如果没有,请尝试:http://rubygems.org/pages/download
答案 1 :(得分:3)
注意:示例脚本也会解压缩符号链接,并且会在没有抱怨的情况下解包../../../../etc/passwd
。 rubyzip gem希望你自己进行路径名洗涤。
请注意,在rubyzip 1.1.4中,Zip::Zipfile
已重命名为Zip::File
。