在不存在的目录中提取ZIP文件

时间:2016-10-13 16:34:03

标签: ruby

我想从ZIP包中提取一个单一的内容类型文件到一个尚不存在的目录中。到目前为止我的代码:

  require 'zip'

  Dir.mkdir 'new_folder'
  #I create the folder

  def unzip_file (file_path, destination)
  Zip::File.open(file_path) { |zip_file| 
  zip_file.glob('*.xml'){ |f| #I want to extract .XML files only
      f_path = File.join(Preprocess, f.name) 
      FileUtils.mkdir_p(File.dirname(f_path)) 
      puts "Extract file to %s" % f_path
      zip_file.extract(f, f_path) 
  }
}
end

成功创建文件夹,但不在任何目录中进行提取。我怀疑工作目录中有错误。有帮助吗?

1 个答案:

答案 0 :(得分:1)

我相信您忘记将unzip方法称为开始...

然而,这就是我要这样做的方式:

require 'zip'

def unzip_file (file_path, destination)
  Zip::File.open(file_path) do |zip_file| 
    zip_file.each do |f| #I want to extract .XML files only
      next unless File.extname(f.name) == '.xml'
      FileUtils.mkdir_p(destination) 
      f_path = File.join(destination, File.basename(f.name)) 
      puts "Extract file to %s" % f_path
      zip_file.extract(f, f_path) 
    end
  end
end

zip_file = 'random.zip' # change this to zip file's name (full path or even relative path to zip file)
out_dir = 'new_folder' # change this to the name of the output folder
unzip_file(zip_file, out_dir) # this runs the above method, supplying the zip_file and the output directory

修改

添加名为unzip_files的其他方法,在目录中的所有压缩文件上调用unzip_file

require 'zip'

def unzip_file (file_path, destination)
  Zip::File.open(file_path) do |zip_file| 
    zip_file.each do |f| #I want to extract .XML files only
      next unless File.extname(f.name) == '.xml'
      FileUtils.mkdir_p(destination)
      f_path = File.join(destination, File.basename(f.name)) 
      puts "Extract file to %s" % f_path
      zip_file.extract(f, f_path) 
    end
  end
end

def unzip_files(directory, destination)
  FileUtils.mkdir_p(destination)
  zipped_files = File.join(directory, '*.zip')
  Dir.glob(zipped_files).each do |zip_file|
    file_name = File.basename(zip_file, '.zip') # this is the zipped file name
    out_dir = File.join(destination, file_name)
    unzip_file(zip_file, out_dir)
  end
end

zipped_files_dir = 'zips' # this is the folder containing all the zip files
output_dir = 'output_dir' # this is the main output directory
unzip_files(zipped_files_dir, output_dir)