Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用rubyzip解压压缩文件夹_Ruby_Ruby On Rails 3_Rubyzip - Fatal编程技术网

如何使用rubyzip解压压缩文件夹

如何使用rubyzip解压压缩文件夹,ruby,ruby-on-rails-3,rubyzip,Ruby,Ruby On Rails 3,Rubyzip,我知道如何使用rubyzip检索普通zip文件的内容。但是我在解压一个压缩文件夹的内容时遇到了麻烦,我希望你们中的任何一个人都能帮助我 这是我用来解压的代码: Zip::ZipFile::open(@file_location) do |zip| zip.each do |entry| next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file? logger.debug "#{entry.

我知道如何使用rubyzip检索普通zip文件的内容。但是我在解压一个压缩文件夹的内容时遇到了麻烦,我希望你们中的任何一个人都能帮助我

这是我用来解压的代码:

Zip::ZipFile::open(@file_location) do |zip|
 zip.each do |entry|
  next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?
  logger.debug "#{entry.name}"
  @data = File.new("#{Rails.root.to_s}/tmp/#{entry.name}")
 end
end
entry.name为我提供zip文件中的文件名。这与普通拉链完美配合。但是当从文件夹创建zipfile时,条目的名称类似于:test folder/test.pdf。当我尝试创建文件时,它告诉我找不到该文件。这可能是因为它位于zip中的“test”文件夹中

如果我将条目检查为文件夹,则找不到文件夹。所以我认为解决方案是将条目作为流读取,然后将其保存为文件。获取条目流很容易,但如何将其保存为文件?这就是我目前得到的

Zip::ZipFile::open(@file_location) do |zip|
 zip.each do |entry|
  next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?
  logger.debug "#{entry.name}"
  @data = entry.get_input_stream.read
  # How do i create a file from a stream?
 end
end
基本上我的问题是:如何从流创建文件?还是有比我更简单的方法

==编辑===
我用回形针来存储文件。

我认为你的问题不在于是否需要从流中写入文件。基本上,如果调用
File.new
它(
File
IO
的子类)。因此,无论您想对来自zipfile的流执行什么操作,都应该对常规文件起作用

当你说

当我尝试创建文件时,它告诉我找不到该文件

我认为发生的情况是,您要创建的文件的父目录不存在(在您的示例中是
测试文件夹
)。您想做的事情是这样的(未经测试):


我通过使用流和创建StringIO解决了这个问题。这是密码

Zip::ZipFile::open(@file_location) do |zip|
 zip.each do |entry|
  next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file?

  begin
   # the normal unzip-code
  rescue Errno::ENOENT
   # when the entry can not be found
   @data = entry.get_input_stream.read
   @file = StringIO.new(@data)
   @file.class.class_eval { attr_accessor :original_filename, :content_type }
   @file.original_filename = entry.name
   @file.content_type = MIME::Types.type_for(entry.name)

   # save it / whatever
  end
 end
end

我发现基于jhwist的更简单的方法可行:

Zip::File.open(@file_location) do |zipfile|
  zipfile.each do |entry|
    # The 'next if...' code can go here, though I didn't use it
    unless File.exist?(entry.name)
      FileUtils::mkdir_p(File.dirname(entry.name))
      zipfile.extract(entry, entry.name) 
    end
  end
end

条件显然是可选的,但如果没有条件,代码将在试图覆盖现有文件时引发错误。

我尝试了您的代码,但它只在项目根目录中创建条目的父文件夹。我仍然无法自己访问条目。这实际上是一个错误::enoint-我想我应该提到这一点。thx THO第一行应该是:
Zip::ZipFile.open(@file_location)do | Zip |
此方法不保留文件的权限。提取后如何保留权限?
Zip::File.open(@file_location) do |zipfile|
  zipfile.each do |entry|
    # The 'next if...' code can go here, though I didn't use it
    unless File.exist?(entry.name)
      FileUtils::mkdir_p(File.dirname(entry.name))
      zipfile.extract(entry, entry.name) 
    end
  end
end