« Xming | トップページ | 今週は毎日 »

2007年1月25日 (木曜日)

Ruby で Win32API 使って TAR32.DLL とか

備忘録代わりに…

最近は会社で専らスクリプト屋さんになってしまってますが、他のヒトの環境でも動くようにするのが面倒な時があります。 あ、 Windows での話です。
例えば、こないだは tar.gz ファイルを展開する必要があったんですが、殆どの同僚は Windows 上でコマンドラインで動く tar なぞ持っていませんし、例えば GnuWin32 にある tar では 'z' オプションが使えないので、単体で tar.gz ファイルの展開が出来ません。
少し調べると、 TAR32.DLL は tar.gz を単体で展開出来るそう。素晴らしい :-)
TAR32.DLL は、統合アーカイバプロジェクトの API に準拠しているそうですが、取敢えずは普通の tar コマンドのように使えればいいので、やっつけで下記の様なラッパスクリプトを Ruby で書いてみました(ヘンな事してたらスミマセン):

#!/usr/bin/ruby

require 'Win32API'

DefBuffSize = 32768

class W32Tar
  def initialize(buffSize = DefBuffSize)
    @buffSize = buffSize
    @buffer   = "\0" * @buffSize
    @objTar   = Win32API.new('tar32.dll', 'Tar', %w(p p p l), 'i')
  end

  def exec(cmdline)
    ret = @objTar.call(nil, cmdline, @buffer, @buffSize)
    return [ret, @buffer.unpack('Z*').pack('Z*')]
  end
end

tar = W32Tar.new
ret = tar.exec(ARGV.join(' '))
print ret.pop
exit ret.shift

TAR32.DLL がエクスポートしている 'Tar' という関数には、通常の tar コマンドと同様のコマンドラインを渡す事が出来るようです。
なので、例えば上記スクリプトを tar.rb という名前で保存していれば:

./tar.rb czvf hoge.tar.gz file1 file2 ....

もしくは

ruby ./tar.rb czvf hoge.tar.gz file1 file2 ....

と、普通の tar コマンドみたく使えるわけです♪ エライぞ!> RubyTAR32.DLL とオレ ^^;
更に Exerb でスクリプトを .exe に変換してあげれば、 ruby を持っていないお友達でも使えるように出来ますし。 Exerb は、スクリプトから使用する dll 等も1つの .exe ファイルにまとめる事が出来て、とっても便利です(使用するライブラリによっては、ライセンス上問題となるのかも知れないので注意が必要なのでしょうが)。

|

« Xming | トップページ | 今週は毎日 »

スクリプティング」カテゴリの記事

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/144752/13648984

この記事へのトラックバック一覧です: Ruby で Win32API 使って TAR32.DLL とか:

« Xming | トップページ | 今週は毎日 »