RubyでZipファイル

  • RubyGemsでrubyzipをインストールする必要がある。
> gem install rubyzip
  • 圧縮の仕方
Zip::ZipFile.open("zipファイル名", Zip::ZipFile::CREATE) do |zf|
  zf.add("zipファイル中のパス(相対パスでもOK)", "元ファイルのパス")
  zf.mkdir("zipファイル中のディレクトリ")
end
  • 圧縮サンプルプログラム

カレントディレクトリ内のフォルダを全てzip圧縮する。

require 'rubygems'
require 'zip/zip'
require 'fileutils'
require 'kconv'

def make_zip(zf, src, options)
  if File.file?(src)
    zf.add(src, src)
    return
  elsif File.directory?(src)
    zf.mkdir(src)
    Dir.foreach(src) do |f|
      next if f == "." or f == ".."
      make_zip(zf, src + '/' + f, options)
    end
    return
  end
end

# src  file or directory
# dest  zip filename
# options :fs_encoding=[UTF-8,Shift_JIS,EUC-JP]
def zip(src, dest, options = {})
  File.unlink(dest) if File.exist?(dest)
  Zip::ZipFile.open(dest, Zip::ZipFile::CREATE) do |zf|
    make_zip(zf, src, options)
  end
end

Dir::foreach(".") do |d|
  next if d == "." or d == ".."
  next if File::ftype(d) != "directory"
  puts d
  zip(d, d + ".zip", :fs_encoding => "Shift_JIS")
end
  • rubyzipのドキュメント

http://rubyzip.sourceforge.net/

  • 気になっている点
    • zipファイルに入れるファイル/フォルダの属性(パーミション、オーナー、タイムスタンプなど)が設定できないのでイマイチ。
    • 作成したzipファイルの中身をLhazで見てみると、フォルダにフォルダアイコンが付かない。なぜ??