1

解凍せずにzipファイルのファイルとディレクトリの内容を表示しようとしています。PHP で Zip ライブラリがインストールされておらず、インストールする権限がありません。

の出力を解析してunzip -l <zipfile>、zip ファイルのディレクトリ構造を他のファイル情報と一緒に取得しようとしています。結果を 1 行ずつ解析することで、ファイル情報を簡単に取得できます。ただし、私はPHPの初心者なので、ディレクトリ構造を配列に変換するのは難しいと感じました。構造は次のようなものです (構造を表示しようとしている構文は無視してください)。サブディレクトリまたはサブファイルは、子インデックス内に配置されます。

$file[0]['file_name'] = 'dir1',
$file[0]['children'] = array($subfile[0]['file_name'] = 'subdir1',
                 $subfile[0]['children'] = .....,
                 $subfile[1]['file_name'] = 'subdir1',
                 $subfile[1]['children'] = .....)
$file[1]['file_name'] = 'dir2',
$file[1]['children'] = array($subfile[0]['file_name'] = 'subdir1',
                 $subfile[0]['children'] = .....,
                 $subfile[1]['file_name'] = 'subdir1',
                 $subfile[1]['children'] = .....)

以下は、 のサンプル出力ですunzip -l <zipfile>

12363  08-18-2010 13:07   lsmaps/aka.gif 
10299  03-10-2010 12:34   lsmaps/aob.gif 
26095  03-10-2010 12:34   lsmaps/cba.gif

それを行うより良い方法を知っていますか?

ありがとう

4

1 に答える 1

0

pclzip純粋な PHP (読み取り: ファイルをプロジェクトにコピーするだけです) zip のリーダーとライター。次のようになります。

require_once('pclzip.lib.php');
$archive = new PclZip('zipfile.zip');
var_export($archive->listContent());

フラットな情報をツリーに変換するには、次のヘルパー関数を使用できます。

function flatToTree($flat) {
    $res = array();
    foreach ($flat as $e) {
        $parent =& $res;
        $path = explode('/', $e['filename']);
        for ($i = 0;$i < count($path) - 1;$i++) {
            if (! array_key_exists($path[$i], $parent)) {
                $parent[$path[$i]] = array('file_name'=>$path[$i],
                                           'children'=>array());
            }
            $parent =& $parent[$path[$i]]['children'];
        }
        $basename = $path[count($path)-1];
        if ($basename != '') { // A file, not a directory
            $parent[$basename] = array('file_name' => $path[$i]);
        }
    }
    return $res;
}
var_export(flatToTree($archive->listContents()));

名前によるファイルへのより高速なアクセスを可能にするために、連想配列 (または辞書/マップ) を使用することに注意してください。で繰り返し処理できますforeach。ただし、数値配列が必要な場合は、array_values各要素を呼び出すだけです。

于 2012-07-23T07:50:21.523 に答える