7z と Rar に対応したい

こんなところでいいかなーとか書いたところで先日思い出しました、ディレクトリをさかのぼるパスを含む書庫の問題。怪しいファイルだけ別のところに展開っていうのは出来ないぽいので、事前に「怪しいけど展開していい?」と聞くことにする。 DLL 側のコマンドラインオプションで対応できる場合はそれも行いました。

RAR 書庫の操作に Unrar32.dll(と unrar.dll)を使ってますが、パスワード保護された書庫の扱いが面白い。 RAR 書庫は格納ファイル名まで暗号化できます。 こんな書庫だと UnrarCheckArchive() だと判別不可。 unrar.dll を直接叩けば、つまり RAROpenArchiveEx() を使えば、フラグでわかるみたいです。しかし強引に? 解決する道を発見しました。

Unrar32.dll 付属の文書によると UnrarOpenArchive() は次のように動作します:

機能
    指定ファイルが unrar32.dll に有効な書庫ファイルかどうか調べ、
    有効であればオープンし、一意の数値(ハンドル)を返します。
(中略)
戻り値
    指定の書庫ファイルに対応したハンドル。エラー時は NULL を返します。

つまり、 UnrarCheckArchive() して判別終わりじゃなくて、 UnrarCheckArchive() してダメでも UnrarOpenArchive() して NULL が返ってこないなら RAR 書庫だと判定すれば良いのではないかと。 ということで試してみたら、書庫か否かの判別はばっちりできました。中を読もうとすると UnrarFindFirst() で終了(戻り値:-1)して読めない(これは当然)、と。前に作ったときはこんな調査やっただろうか…。 ともあれこれでよし。

さてパスワード保護の有無をどう調べればいいか。上のような場合はすぐわかるけど、ファイル名を暗号化してない場合、中は普通の書庫と同様に読めるので判別のしどころが無いみたいで。 7-zip32.dll だと中を読んだときファイル属性にパスワード保護がついてるので分かるんですけど。

とまあこんな感じで、問題はあるものの RAR・7z(zip)書庫の読み取りとか展開をできるようになりました。


About this entry