CustomScript

ページ

2010年12月2日木曜日

rarをzipに変換 (ruby+unrar.exe+zip.exe)

圧縮形式を同じにしたほうがアイコンとかそろって気持ちいい。
ということでまずはrarをzipにすることを考えてみた。

rubyの勉強がてら変換スクリプトをgoogle先生に相談しつつ組んでみました。

環境



それぞれコマンドラインから使用できる状態にしておく

使用方法


$ ruby.exe rar2zip.rb [file.rar ...]

入力したrarファイルをzipに変換して出力します。
アーカイヴ名と内包するトップディレクトリ名が同じ場合、そのディレクトリ名を省略します。

rar2zip.rb

#!/bin/ruby -Ks
require 'tmpdir'

## error.
def failed(msg)
  puts "\nFailed!! -- #{msg}\n"
  abort
end

## system command.
def command(cmd)
  system cmd or failed "command failed.: #{cmd}"
end

## usage.
def usage
  print <<-EOS

rar2zip.rb ver 0.1
Usage: [ruby.exe] rar2zip.rb file.rar ...
  EOS
end

## main.
usage if ARGV.size==0
ARGV.each do |input|
  puts "#{input} ..."
  failed "file is not RAR." unless File.extname(input)=~/\.rar$/i
  output = File.expand_path(input).gsub(/\.\w+$/,".zip")
  failed "ZIP file already exists." if File.exist?(output)
  Dir.mktmpdir("temp-",".") do |temp|
    command "unrar x -inul \"#{input}\" #{temp}"
    dir = temp + "/" + File.basename(input,".*")
    dir = temp unless File.directory?(dir) && Dir.entries(temp).size==3
    Dir.chdir(dir) do
      command "zip -q -r \"#{output}\" *"
    end
  end
end
puts "Done."

所感


実装してて思ったのが、日本語ファイル名が意外と変換には厄介だということ。
文字化けしたり、途中でこけたりというアーカイバが結構あります。
大事なのは同じOSで、そのOS用にカスタムビルドしたツールを使うこと。
最初Cygwin上で実装しててはまりましたよ。ええ。