ZIP圧縮ファイルを解凍する

ZIP圧縮ファイルを解凍するには、UnZip32.DLLを使用するか、最近発表された7-zip32.DLLを使用する。
どちらも共通アーカイバDLL仕様に沿っているので、使い方は基本的に同じなのだが、作者様が別人であるし、オリジナルのルーツも全然違う物なので、微妙に差がある。
共通アーカイバDLL仕様のDLLで、圧縮ファイルを解凍するには、MS-DOS時代のコマンドラインと同じ文字列を引数に持つUnZip32.DLLなら「UnZip関数」、7-zip32.DLLなら「SevenZip関数」を使用する。
DLL同梱のドキュメントによれば、それぞれ、

(UnZip32.DLL)
int WINAPI UnZip(const HWND hWnd,LPCSTR szCmdLine,
                 LPSTR szOutput, const DWORD dwSize);
(7-zip32.DLL)
int WINAPI SevenZip(const HWND _hwnd, LPCSTR _szCmdLine,
                    LPSTR _szOutput, const DWORD _dwSize)

となっているので、Visual Basicでの宣言は、

Declare Function UnZip Lib "UnZip32.DLL" _
                                (ByVal hWnd As Long, _
                                 ByVal szCmdLine As String, _
                                 ByVal szOutput As String, _
                                 ByVal dwSize As Long) As Long
Declare Function SevenZip Lib "7-zip32.DLL" _
                                (ByVal hWnd As Long, _
                                 ByVal szCmdLine As String, _
                                 ByVal szOutput As String, _
                                 ByVal dwSize As Long) As Long

となる。引数は全く同じである。
szCmdLineに、コマンドラインという文字列を渡すのである。やはり、DLL同梱のドキュメントによれば、

(UnZip32.DLL)
        [-] [[-...] [.ZIP]
             [] [[@|]...]
(7-zip32.DLL)
   [...]  [] [...]

と一見違うように思えるが、「コマンド」「オプションスイッチ類」「圧縮ファイル名」「基準ディレクトリ」「ファイルリスト」と順序も一緒である。
しかし、書かれていないことに関して微妙に違うのである。(^_^;)
例えば、圧縮ファイル「C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip」の
中の「SRC*.Bas」ファイルを、
ディレクトリ「C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM」に解凍する場合コマンドラインは、

(UnZip32.DLL)
-x -s "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" SRC*.Bas
(7-zip32.DLL)
x -aoa "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" SRC*.Bas

となる。
なお、7-zip32.DLLは、解凍先のディレクトリが存在しないとエラーになって解凍できない。(UnZip32.DLLはディレクトリを作成してくれる。)
また、解凍するファイルを複数指定する場合、レスポンスファイルを利用する事が多いが、レスポンスファイルとしての認識のために「@」を付けて、

(UnZip32.DLL)
-x -s "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" "@C:Documents and SettingsAdministratorLocal SettingsTempresponce"
(7-zip32.DLL)
x -aoa "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" "@C:Documents and SettingsAdministratorLocal SettingsTempresponce"

とするが、UnZip32.DLLは「”」でレスポンスファイル名を括った後「@」を付けても、レスポンスファイル名に「@」を付けた後で「”」で括っても大丈夫だが、7-zip32.DLLは後者のみが有効である。(ドキュメントではUnZip32.DLLでも後者しか書かれていない。)
余談であるが、7-zip32.DLLを使ってZIPファイルを作成する場合で、ディレクトリを指定する場合、

u -tzip -mx -r0 "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFMsrc.zip" "C:Documents and SettingsAdministratorMy DocumentsHEROPAVBDeFM" SRC*

のように「*」を付けないと、本当にディレクトリだけで、ディレクトリ配下のファイルやサブディレクトリは圧縮されない。

http://www31.ocn.ne.jp/~heropa/vb40.htm

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です