unzipcmdのバグ?

  • 投稿日:
  • by
  • カテゴリ:



よくわかりませんが。



zlib付属のminizipでもよかったんですが、CE用はスタブを書かないとダメで、テニックさんはgzipだけ移植してあるんですよね。


gzipは単一ファイルなので、フォルダを固めたzipを解凍できないわけです。


というわけで、PocketUnZip1.0のページから、お決まりのInfo-Zipのページへ辿り、srcの中をゴニョゴニョ眺めたら、どうやら2003年レベルの新しいCE向けスタブが詰まっていそうなので採用。



http://www.stevemiller.net/punzip/




まず、eVC用のプロジェクトファイルがeVC3用なので使い物にならず。


手作業でプロジェクトファイルを作ったりして大変でした。


んで、解凍すると解凍ディレクトリ名とファイル名の間に"\0"という文字が・・・



例:


infalting: /ziptest/\0README.TXT


infalting: /ziptest/\0Makefile


・・・




ディレクトリ指定しなければ出ない現象・・・


原因は、



intrface.c



int checkdir(__GPRO__ char *pathcomp, int flag)

で、



// Add trailing path separator
G.rootpath[G.rootlen++] = '\\';
G.rootpath[G.rootlen] = '0';

となっているため、-dオプションで指定した解凍ディレクトリのケツに"\0"という文字が追加されてしまいます。


'\0'つまりヌルではなく、"\0"です。


ケツにセパレータを追加したいだけのようなので、以下のように直しました。



// Add trailing path separator
G.rootpath[G.rootlen++] = '\\';
// Chg 2008.11.16 syasuda start
G.rootpath[G.rootlen] = '\0';
// G.rootpath[G.rootlen] = '0';
// Chg 2008.11.16 syasuda end

それにしてもとんでもないtypoですなぁ。


でCE5.0のEmulator(x86)で動かしてみると1.5MBのunzip552.zipがものの数秒で解凍できました。


もう少し大きいのでは、以下のような結果に。



eclipse-cpp-europa-win32.zip 64MB(600ファイル、解凍後69MB) 2分50秒



ただし、quietモードで実行しないとコマンドプロンプトにダラダラプリントされて、すげー遅くなります。


実際のハードだと、ファイルIOの速度に引っ張られそうですが。


極端な想定でファイルIOがすこぶる遅い場合、圧縮ファイルから読み出して必要な部分だけメモリに展開するほうが、パフォーマンスが出るかもしれないということです。



コマンド例


> unzipcmd -q hoge.zip -d /foo/bar



対象ファイル



ftp://tug.ctan.org/tex-archive/tools/zip/info-zip/src/


unzip552.zip



定義したマクロ



NO_ZIPINFO



バージョンメモ



Windows CE 5.0 Emulator(x86) ただしPBで作ったメモリがでかいイメージ