ということでまずはrarをzipにすることを考えてみた。
rubyの勉強がてら変換スクリプトをgoogle先生に相談しつつ組んでみました。
環境
- OS -- Windows (commandline)
- ruby 1.8.7 -- ruby-mswin32
- unrar.exe -- UnRAR for Windows
- zip.exe -- Windowsでzip.exeとunzip.exe
それぞれコマンドラインから使用できる状態にしておく
使用方法
$ 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上で実装しててはまりましたよ。ええ。


