それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rubyでWindows(sjis)用のZIPファイルを作る。

linuxでZIPファイルを作るとWindowsで文字化けしてしまう。日本語はSJISに変換してからZIPに追記したいです。でもZIPコマンドは対応がいまいちでした。圧縮率は考えず、ただ、アーカイブ出来ればOK。

使い方

ruby zip-cp932.rb システム見積もり書-2011-03-01.zip  システム見積もり書-2011-03-01
zip-cp932.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'kconv'
require 'zipruby'
require 'fileutils'
KCODE="u"
#windowsで開いて文字化けしないように
#cp932でファイル名を指定してアーカイブする


exit if ARGV.size < 1
if ARGV.size == 1 then
ZIPFILE_NAME = ARGV[0].strip.toutf8+".zip"
DIR_NAME     =  ARGV[0].strip.toutf8
elsif ARGV.size >= 2 then
DIR_NAME =  ARGV[1].strip.toutf8
ZIPFILE_NAME = ARGV[0].strip.toutf8
end
raise "存在しないディレクトリ'#{DIR_NAME}'".toutf8 unless File.exist? DIR_NAME
File.unlink ZIPFILE_NAME if File.exist? ZIPFILE_NAME
full_path = File.expand_path DIR_NAME
begin 
  Zip::Archive.open(ZIPFILE_NAME, Zip::CREATE ){ |ar|
    top_dir_name = File.basename(full_path).tosjis
    ar.add_dir(top_dir_name)
    Dir.chdir(full_path){|dir|
      Dir.glob("**/*".gsub(" ", "\\ ")).each{|entry|
        if File.directory? entry
          ar.add_dir( top_dir_name+"/" + entry.tosjis )
        else
          ar.add_file(top_dir_name+"/"+entry.tosjis,entry)
        end
      }
    }
  }

rescue => e
  puts e
  puts ARGV.join("\n")
end

Ruby簡単ですね。手作業がどんどん減っていきます。集中してRubyで書いたらほんと速いです。