如何使用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.name}\"
  @data = File.new(\"#{Rails.root.to_s}/tmp/#{entry.name}\")
 end
end
entry.name为我提供了zip文件中文件的名称。这与普通的zip文件完美配合。但是,从文件夹创建zip文件时,条目的名称类似于: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
基本上我的问题是:如何从流创建文件?还是有比我更简单的方法? ===编辑=== 我使用回形针存储文件。     
已邀请:
我发现一种基于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
该条件显然是可选的,但是如果没有条件,该代码将在尝试覆盖现有文件时引发错误。     
我认为您的问题不是您是否需要从流中写入文件。基本上,如果调用“ 3”,它将创建一个新的IO-Stream(“ 4”是“ 5”的子类)。因此,无论您想对zip文件中的流进行什么处理,都应该与常规文件一起使用。 当你说   当我尝试创建文件时,它告诉我找不到文件 我认为发生的事情是您要创建的文件的父目录不存在(在您的情况下为
test-folder
)。您想要做的是类似的事情(未经测试):
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}\"
   FileUtils::mkdir_p(File.dirname(entry.name)) # might want to check if it already exists    
   @data = File.new(\"#{Rails.root.to_s}/tmp/#{entry.name}\")
 end
end
    
我通过使用流并创建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
    

要回复问题请先登录注册