さるもすなるぷろぐらむU zip file list
●PHPでWindowsアプリケーションを作る−ZIP書庫内のリストを出力する
■はじめに
ひょんなことから、圧縮したZIP形式ファイルの中身をリスト(紙)に出したくなりました。
フリーのその手のツールを探しましたが、ぴったりするものが見つかりませんでした。画面に表示する機能はあるが、紙に出せなかったり、出せてもファイル名が化けたり。
UNIX系ならzipinfoコマンドで出せそうだけど・・・・
ここで、おぼえたてのPHPにZIPファイルをアクセスできるライブラリ/関数が準備されているのを見つけたので、Windowsのアプリにできないか試しました。
・・・・ハマリました。そんなに簡単にはいきませんでした。別の手段(C言語とか)でまともに勉強してから作った方が早かったかも。
でも、とりあえず何とかなったので、ここで公開します。
■開発するための環境
Eclipse(Pleiades)、WinBinder、Bamcompileを環境として使いました。
開発環境については、ここのテーマの「PHP−はじめの半歩」、
「PHPからWindowsアプリケーションを作る−はじめの半歩」を参照してください。
■おおよその開発手順
(1)Eclipseの環境でZIP形式リストを出力するコアの処理を作成/テストする。
(2)(1)でそこそこ動いたら、Bamcompileの環境でコンパイルしてみる。
(3)WinBinderでGUIを作って完成形のプログラムを作る。
(4)再度Bamcompileでビルドして動作を確認する。
■ハマったこと
・PHPには何種類かZIPファイルをアクセスするライブラリ(関数セット)が何種かあるが、
書庫内のリストを出力するぴったりの関数が無い?
・最初zip関数を使ったが、(2)で動かなかった。
=>DLLの取り込みが必要?=>利用断念。
・次にZipArchiveクラスを使用して見たが(2)で動かない。
=>PHP4では使えない?DLLの取り込みもやって見たがダメ。=>利用断念。
・次にPEAR::Archive_Zipクラスを使用してみた。書庫内ファイルのファイル属性を取り出す仕掛けがない。
=>EclipseのPHP動作環境に含まれるZip.phpとPEAR.phpをコンパイル環境にコピーして、
=>Zip.php内の_convertHeader2FileInfo()をカスタマイズしました。
・ここで、ZIPファイルに含まれる圧縮ファイルのファイル名が日本語だった場合、
作成した環境によって文字コードが異なるという情報が・・・・
なので、UTF-8だったら単純にリスト出力したら文字化けするでしょう。
=>今回は放置。Windowsで作成したZIPファイルのみサポート。
・(3)でGUIを作たが、動かない。
=>ZIPアクセスを行う関数の直前にinclude_oneceでZip.phpをインクルードしていたが、それが悪かったみたい。
先頭の方に持っていったら、動いた。
・スクリプト実行して動いたphpwをBamcompileして、正常にビルドできるのに動かない。
それとアイコンを指定しているが、exeのアイコンが変わらない。
=>Bamcompileのbcp内の記述に今までの「試し」の内容をコメント(;・・・・)で残してあった。
どうもそれが悪さをしているみたい。
上記のような内容を「変更してみては、試す」的にやって、何とか動くところまで持ってきました。
■サンプルソース
こんなソースです。
<phpw>
<form.php>
<bcp>
■こんな感じ
以下のような絵が出て、
ZIPファイルと出力先を指定すると、こんな内容が出力されます。
EXEとスクリプトのソース一式はここからダウンロードいただけます。よろしければどうぞ。