【问题标题】:How to unzip a file with ruby如何使用 ruby​​ 解压缩文件
【发布时间】:2014-03-18 17:41:42
【问题描述】:

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

我做错了什么? 谢谢!

【问题讨论】:

  • 试试::Zip::ZipFile.open(file_path) ..
  • "gem install ruby​​gems" 然后就亮了。
  • 如果 Ruby 脚本开始自行安装 gem,我会感到非常惊讶。最好在LoadError 上简单地中止并喊用户自己安装gem。

标签: ruby rubyzip


【解决方案1】:

注意:示例脚本也会解压符号链接,并且会解压../../../../etc/passwd 而不会产生任何抱怨。 rubyzip gem 期望您进行自己的路径名清洗。

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

【讨论】:

    【解决方案2】:

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

    `gem install rubyzip`
    

    在完成 gem 安装之后,您当前的 irb 会话仍然看不到它。您必须使用exec "irb" 重新加载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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多