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.shiftTAR32.DLL がエクスポートしている 'Tar' という関数には、通常の tar コマンドと同様のコマンドラインを渡す事が出来るようです。
なので、例えば上記スクリプトを tar.rb という名前で保存していれば:
./tar.rb czvf hoge.tar.gz file1 file2 ....
もしくは
ruby ./tar.rb czvf hoge.tar.gz file1 file2 ....
と、普通の tar コマンドみたく使えるわけです♪ エライぞ!> Ruby と TAR32.DLL とオレ ^^;
更に Exerb でスクリプトを .exe に変換してあげれば、 ruby を持っていないお友達でも使えるように出来ますし。 Exerb は、スクリプトから使用する dll 等も1つの .exe ファイルにまとめる事が出来て、とっても便利です(使用するライブラリによっては、ライセンス上問題となるのかも知れないので注意が必要なのでしょうが)。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- AmigaOSのHDDジオメトリ (つづき)(2017.05.29)
- AmigaOSのHDDジオメトリ (つづく…)(2017.05.23)
- Firefox41 で .keysnail.js がエラーしてた件(2015.10.12)
「スクリプティング」カテゴリの記事
- Android の adb backup から一部だけリストアしちゃー(2014.08.22)
- Python の正規表現が激遅だと思ったら(2013.05.27)
- Pythonの日本語版HTMLヘルプ再構築(2013.03.07)
- migemo の ruby 1.9 対応 (NTEmacs + Cygwin)(2012.10.30)
この記事へのコメントは終了しました。


コメント