2012-07-23 99 views
1

我试图在不提取它的情况下显示zip文件的文件和目录内容。 Zip库没有安装PHP,我没有安装它的权限。列出zip文件的文件和目录内容

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

你知道更好的方法吗?

感谢

回答

0

pclzip纯PHP(读:你可以将文件到您的项目中复制)的读者和作家的拉链,这样的:

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即可。

+0

谢谢@phihag!我已经可以解析这些信息了。我的问题是将数据安排到类似于我在我的问题中提供的示例的数组中。 – artsylar 2012-07-23 08:09:55

+0

@artsylar使用辅助函数进行扩展。 – phihag 2012-07-23 08:37:46

+0

它现在正在工作!非常感谢你的帮助@ PHPhag! – artsylar 2012-07-23 10:26:59

相关问题