1

我正在尝试显示 zip 文件的文件和目录内容而不解压缩它。Zip 库未随 PHP 一起安装,我无权安装它。

我现在正在尝试解析的输出unzip -l <zipfile>以获取 zip 文件的目录结构以及其他文件信息。我可以通过逐行解析结果轻松获取文件信息。但是,我发现很难将其转换为数组中的目录结构,因为我只是 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 回答