« 2012年12月 | トップページ | 2013年3月 »

2013年2月

2013年2月 9日 (土)

libarchive for Delphi

ZIP以外でよく見かける拡張子TAR、7z、RARのファイルを解凍できるライブラリが必要になったので、色々調べてました。

まず、RARの解凍なら本家のUnRar.dll があります。暗号化やマルチボリューム化されたRARの解凍にも対応してるのですが、解凍元としてファイルしか指定できず、メモリを解凍元として解凍とかそういうことはできないので、すごいしょぼーんですdashdash。解凍先はファイル以外にもメモリに解凍できるように自由にカスタマイズできます。

次に、TARの解凍なら統合アーカイバプロジェクトのTAR32.dll があります。で、これも使ってみたのですが、まず、これも解凍元としてファイルしか指定できず、しかも、Unicodeのファイル名を与えられないので、速攻使う気失せましたcrying。Delphi専用ならTurboPower abbrevia とかいうのがあるが・・

7zの解凍は本家のLZMA SDK を使って解凍できます。LZMA SDKには7zのみならず、RARやTARなど様々な種類のフォーマットのファイルを解凍できるライブラリが含まれてます。このライブラリは暗号化やマルチボリュームにも対応してて、しかも、解凍元・解凍先をファイルやメモリなど自由にカスタマイズできます。で、実際いろいろ使ってみたのですが、なんか、動きが怪しい部分がある・・・gawk。例えば、パスワードで暗号化されたファイルを解凍しようとすると、パスワードを要求するコールバックが呼ばれたりするんですが、解凍するファイルによってなぜか複数回コールバックが呼ばれたりうむむ・・・・

このライブラリの作者は一人?でLZMA SDKから、圧縮・解凍ソフトの7Zip自体の開発をしてて品質を維持するのきびしいんじゃと邪推・・

他に.NET用としてSharpCompress などよさそうなものを発見したのですが、ネイティブで自分の要件に合うよさそうなのはあんまいいものがないんだな・・・

と、思ってたのですが発見しました。libarchive ですhappy02happy02。ZIP、TAR、7z、RARはもちろんLHA、CABなどのフォーマットやCOMPRESS、GZIP、BZIP2、LZMAなどの圧縮・伸長にも対応してます(GZIPに対応するにはzlib、BZIP2はlibbz2などのようにさらに他のライブラリが必要になりすますが)。もちろん、解凍元・解凍先をファイルやメモリなど自由にカスタマイズできます。ただ、現状、暗号化には対応してないようです。マルチボリューム(例えばRARなど)には対応してるようですが、APIの使い方が微妙・・とはいえ、実際使ってみると、やっぱいい感じです。複数人で開発されてるっぽいし、テストケースもしっかり用意されてるので、安心感があります。

ただ、1点気になるのは、パスにUnicodeな文字を含むエントリを含むファイルを解凍するには、iconvというライブラリが必要という・・・残念・・・Windows環境にまでiconv持ち出されるとうざすぎる・・・weepweep

うーん。

ということで、とりあえず、Delphi用のヘッダ(LibArchive.pas)だけでも・・

実際に使うにはlibarchiveを自分でビルドしてください・・Delphi用のヘッダはとりあえずMicrosoft Visual C++に合わせてあります。他の環境で使う場合は、LibArchive.pasのsize_tやtime_t、wchar_tなどの定義を各自変更して下さい。

« 2012年12月 | トップページ | 2013年3月 »

自作ソフトウェア

無料ブログはココログ

メモ