Home > C++, Sample > ZIPファイルをVC++で作るには(下)

ZIPファイルをVC++で作るには(下)

1月 10th, 2006

久しぶりの更新。
随分と間があいてしまいました。

とりあえず、以前書いていた、VC++でZipファイルを作るサンプルが出来たので
アップロードしました。当初はZip32J.dllを使うことを考えていたんですが、
このDLLは結局zip32.dllが必要になると言うことで、それが気に入らなくて
断念しました。変わりにzip32.dllを使って圧縮をやってみました。

しかしこのzip32.dllは非常に使いにくくて、メチャクチャ苦労しました。
こういったライブラリではヘッダーファイル(*.h)とライブラリ(*.lib)を
インポートして使うのが普通だと思うんですが、このライブラリは
LoadLibraryとかいうAPIを使ってDLLをロードして、そこからAPIの
アドレスを取得するという方法でAPIにアクセスする形になっていました。
そこまで大掛かりな作業ではないですが、かなり使い勝手が悪いと感じました。
僕がダウンロードしたライブラリが間違ってたとか、そういうオチかもしれませんが・・・。

肝心の圧縮処理ですが、これはかなり楽でした。楽過ぎて問題があると感じた程でした。
ZpInitという関数で初期化を行った後、ZpSetOptionsという関数で圧縮のオプションを
指定。最後にzpArchiveという関数にパラメータでファイル名を渡すと・・・
ファイルを圧縮。ディレクトリの場合はオプション次第では再帰的に全て処理してくれます。

再帰的に全部やってくれるのはうれしいんですが、これだと中間処理がコントロール
できないので問題があるのではと思いました。何種類かのコールバック関数が指定できる
ようなので、「現在何個目のファイルの処理をしているか」くらいはわかりそうなものの、
「今ファイルのどのあたりを処理しているのか」は調べられないんじゃないかと思いました。
zip32j.dllもこのDLLを使っているということは、何らかの形で出来るんだとは思いますが。

そんなこんなでようやくZipファイルが作れるようになったわけですが、
実は今日までの間に、zip32.dllとは別の、もっと良さそうなライブラリが見つかりました。
7-zip32.dllというライブラリです。7-zipは、zipよりも大分圧縮率の良いアルゴリズムらしい
です。このライブラリの存在も知っていたんですが、まさかzip形式も行けるとは
知りませんでした。7-zip32.dllはzip、7-zipの圧縮、解凍ができるライブラリらしいです。
使い方もちょっと見てみたんですが、圧縮であれば、圧縮用の関数にコマンドライン文字列
を渡すだけで圧縮してくれるようです。圧縮の状況を把握するコールバック関数も
設定できるようなので、これは問題なさそう。素晴らしいと思いました。
7-zip32.dll版もそのうちやってみようと思います。

Zipファイル作成サンプル1(VC++2005用)(実行ファイル付き)
ダウンロード(156KB)


2006-09-04 追記

サンプルの配布形態がInfoZipライセンスに準拠していなかったため修正しました。
また、今まではInfoZipライブラリを同梱していませんでしたが、同梱するように変更しました。

See also:
ZIPファイルをVC++で作るには(上)
グダグダな1年
VC++から7-zip32.dllを使うサンプル

このエントリーをはてなブックマークに追加
はてなブックマーク - ZIPファイルをVC++で作るには(下)

C++, Sample , , ,

  1. No comments yet.
  1. No trackbacks yet.