とある日の妄想モバイル - 慢心は己の敵

0.戻る

2003年09月17日(木)

油断すると、とり憑かれるね〜ほんとに。どんな物事でもそうだと思うけど、慣れてきたときが一番危ないっていうのはこういうことなんだろうな。常に冷静に、客観的に自分をみることができるようにつとめよう。

それはともかくCJZip(0.7以前)に意外と大きな問題点があった。
ディレクトリを圧縮すると、StuffIt Expanderで解凍できない。ファイルのみをドロップした場合は解凍できるんだけど、ディレクトリを含むアーカイブを解凍すると、ディレクトリの中身が空になってしまう。

どうしてかは、結局良く分からなかった。JavaのZip関連のクラスを使ったサンプルを掲載しているサイトも、Windows系の解凍ソフトでうまく解凍できないという問題について触れているところがいくつかあった。どれをみても、残念ながら、これだ!という解決策は見当たらなかった。

で、俺がとった解決策は、ディレクトリをアーカイブに追加するときは

ZipOutputStream.setMethod(ZipOutputStream.STORED)

とし、ファイルのときは

ZipOutputStream.setMethod(ZipOutputStream.DEFLATED)

とする。そしてディレクトリエントリの書き込みをする前に

ZipEntry.setCrc(0)

として、CRC32情報をエントリに設定しておく。なぜかは分からないが、setCrcは圧縮メソッドがSTOREDでないとファイルにデータとして記録できないようだ(ただし、その場でエントリからgetCrcなどを使って読み出せば、DEFLATEDでも設定値が読み出せる)。setSizeなども同様だった。

ファイルを圧縮するときもSTOREDにすればCRC32は書き込めるが、ファイル自体が圧縮されないまま格納されているような感じで、ファイルサイズが変わらないので、実用的でない。

とりあえず上記の方法で、StuffIt Expander(Mac)、解凍レンジ(Win)、Lhasa+(Win)で解凍できることを確認した。ファイルへのCRC32設定などについては、引き続き調べていきたいと思う。
0.戻る

©2001-2009 konkon All Rights Reserved.