MS Access Tips/Sample and VBA and Blog customize etc...

7-zip32.DLLを利用してZIPファイルの作成と解凍

ZIP圧縮はいままで、Shell関数で Lhaplus をコマンドラインで呼び出していました。が、連続でZIPファイルを作成する必要が出てきて、Shell関数だと非同期だし、ダイアログが鬱陶しいし、で不満でした。DLLを利用した圧縮と解凍の関数を作成しようと思い立ちました。

DLLを利用したZIPファイルの作成は ZIP32J.DLL + ZIP32.DLL が一般的なようですが、これだと圧縮だけしかできないです。解凍は UNZIP32.DLL が別に必要になります。

で、他にないか探してみました。

7-zip32.DLLを利用してZIPファイルの作成と解凍タイトル

難易度:

7-ZIP32.DLL のインストール

統合アーカイバプロジェクト

の個別ライブラリを見ると、

7-ZIP32.DLL
Igor Pavlov 氏が開発し、高圧縮率で一部の人に支持されている 7z 形式の書庫の圧縮・解凍及び、他の zip 互換プログラムより少しだけ圧縮率の高い zip 書庫の圧縮・解凍をサポートするライブラリです。

というのが見つかります。これだとこれだけで圧縮も解凍も可能だし、少しだけ圧縮率の高いzipファイルが作成できというのもちょっと惹かれます。で、このライブラリを利用することにしました。

下記よりファイルをファイルをダウンロードします。

Common Archivers Library: 7-ZIP32.DLL

ZIPファイルですので、その中の 7-zip32.dll をWindowsのシステムフォルダにコピーします。通常は、32ビット版の場合は「C:\Windows\System32」、64ビット版の場合は「C:\Windows\SysWOW64」です。

これで準備完了です。

標準モジュールのコード

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 を参照ください。

使用例

拍手する

6 Comments

名無し says..."質問"

zip内の特定のファイルだけ解凍するにはどうすればいいですか?

2015.10.27 10:41 | URL | #VVspvHsA [edit]
hatena says..."re:質問"

> zip内の特定のファイルだけ解凍するにはどうすればいいですか?

記事のコードの ExtractZIP関数を下記のように修正します。

Public Function ExtractZIP(sDstPath As String, sZIPFile As String, Optional sPassWord As String = "", Optional sFileName As String = "") As Boolean
  Dim sCmd As String
  sCmd = "X -hide -aoa "
  If sPassWord <> "" Then sCmd = sCmd & "-P" & sPassWord & " "
  sCmd = sCmd & Q2(sZIPFile) & " -o" & Q2(sDstPath)
  If sFileName <> "" Then sCmd = sCmd & " " & sFileName
  ExtractZIP = DoSevenZip(sCmd) = 0
End Function


使用例

If ExtractZIP("C:\TEMP\", "C:\test\Test.zip", ,"Test.txt") Then
  MsgBox "ZIPファイル内のTest.txtを解凍しました。"
End If

ファイル名にはワイルドカードも指定できます。

2015.10.27 15:56 | URL | #5uE6dEgY [edit]
atropos_043 says..."複数フォルダにまたがったファイルの圧縮"

7-zipでは複数ファイルの圧縮に対してテキストファイルに記載されたリストを用いて対応出きると思いますがこの場合はどのようにしたらよいでしょうか。

2016.12.07 14:34 | URL | #mQop/nM. [edit]
hatena says..."re:複数フォルダにまたがったファイルの圧縮"

ダウンロードしたファイル内の 7-zipCMD.txt によると、
リストファイル名の前に @ を付けるという説明がありますので、
下記のようにすればいけそうな気がします。

Send2ZIP("@C:\TEMP\listfile.txt", "C:\test\Test.zip")

試していませんので、うまくいったらご報告ください。

2016.12.08 11:30 | URL | #5uE6dEgY [edit]
hatena says..."re:re:複数フォルダにまたがったファイルの圧縮"

時間があったので試してみたら、できました。

If SendToZIP("@C:\TEMP\listfile.txt", "C:\test\Test.zip") Then
  MsgBox "ZIPファイルを生成しました。"
End If

2016.12.08 14:55 | URL | #5uE6dEgY [edit]
atropos_043 says..."re:re:re:複数フォルダにまたがったファイルの圧縮"

記載されていたやり方で複数ファイルをパスワード付Zipに圧縮することが出来ました。
ありがとうございました。

2016.12.10 18:30 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/376-48d3e565
該当の記事は見つかりませんでした。