7-zip32.DLLを利用してZIPファイルの作成と解凍
ZIP圧縮はいままで、Shell関数で Lhaplus をコマンドラインで呼び出していました。が、連続でZIPファイルを作成する必要が出てきて、Shell関数だと非同期だし、ダイアログが鬱陶しいし、で不満でした。DLLを利用した圧縮と解凍の関数を作成しようと思い立ちました。
DLLを利用したZIPファイルの作成は ZIP32J.DLL + ZIP32.DLL が一般的なようですが、これだと圧縮だけしかできないです。解凍は UNZIP32.DLL が別に必要になります。
で、他にないか探してみました。
難易度:
7-ZIP32.DLL のインストール
の個別ライブラリを見ると、
7-ZIP32.DLL
Igor Pavlov 氏が開発し、高圧縮率で一部の人に支持されている 7z 形式の書庫の圧縮・解凍及び、他の zip 互換プログラムより少しだけ圧縮率の高い zip 書庫の圧縮・解凍をサポートするライブラリです。
というのが見つかります。これだとこれだけで圧縮も解凍も可能だし、少しだけ圧縮率の高いzipファイルが作成できというのもちょっと惹かれます。で、このライブラリを利用することにしました。
下記よりファイルをファイルをダウンロードします。
Common Archivers Library: 7-ZIP32.DLL
2021/09/06 追記: 下記のサイトのdllファイルの方が新しそうです。また 32bit版と64bit版のDLLファイルが同封されているので64bitOfficeをご利用の場合はこちらからダウンロードしてください。
本家の7-zipのダウンロードサイトからダウンロードしたものは日本語環境では使用できませんので注意ください。
ZIPファイルですので、その中の 7-zip32.dll をWindowsのシステムフォルダにコピーします。通常は、32ビット版の場合は「C:\Windows\SysWOW64」、64ビット版の場合は「C:\Windows\System32」です。
これで準備完了です。
標準モジュールのコード
7z形式のより圧縮率の高いファイルも作成出来ますが、なるべくシンプルにしたいので、今回はZIPのみの圧縮、解凍の関数にしました。標準モジュールに下記のコードをコピーして貼り付けてください。
解説
SendToZIP(圧縮時)のsSrsPathにファイルのパスを指定するとそのファイルを圧縮します。フォルダーのパスを指定すると、そのフォルダー内のすべてのファイル、サブフォルダーを圧縮します。
SendToZIP(圧縮時)のsZIPFile(ZIPファイルのパス)に存在しないフォルダーを指定すると、フォルダーを作成してそこにZIPファイルを生成します。
ExtractZIP(解凍時)のsDstPath(解凍先)に存在しないフォルダーを指定するとフォルダーを作成してそこに解凍します。
解凍または圧縮が失敗したら、ライブラリの出すメッセージをメッセージボックスで表示します。
SendToZIP関数の下記のコードでコマンドのスイッチオプションを設定しています。
sCmd = "a -tzip -mx9 -hide "
-hide は処理状況ダイアログを非表示にします。表示したい場合は削除してください。
ExtractZIP関数の下記のコードでコマンドのスイッチオプションを設定しています。
sCmd = "X -hide -aoa "
-aoa は、全てのファイルを確認しないで上書きします。
その他、コマンドの詳細は下記を参照してください。ダウンロードした書庫ファイル内の 7-zipCMD.txt を参照ください。
使用例