Rubyでunzipする方法

サイトをいろいろあさって、よさそうなものを手直してメモさせていただきました。

require 'fileutils'
require 'zip/zipfilesystem'

def unzip(src, dest)
  Zip::ZipInputStream.open(src) do |rf|
    src = src.encode("UTF-8").gsub("\\", "/")
    while entry = rf.get_next_entry
      dir = File.dirname(entry.name)
      FileUtils.mkdir_p(File.join(dest,dir))
      path = File.join(dest,entry.name)
      unless entry.name_is_directory?
        puts path
        File.open(path, "wb") do |wf|
          wf << rf.read
        end
      end
    end
  end
end


unzip "zip/file/path/", "/path/unzip/"

次は、ziprubyライブラリを使ったものです。

require 'fileutils'
require 'zipruby'

def unzip(src,dest)
  Zip::Archive.open(src) do |entries|
    entries.each do |entry|
      name = entry.name.encode("UTF-8").gsub("\\", "/")
      if entry.directory?
        FileUtils.mkdir_p(File.join(dest,name))
      else
        dirname = File.join(dest,File.dirname(name))
        FileUtils.mkdir_p(dirname)
        puts File.join(dest,name)
        open(File.join(dest,name), "wb") do|f|
        f << entry.read
        end
      end
    end
  end
end

unzip "zip/file/path/", "/path/unzip/"