我试图在不提取zip文件的情况下显示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
你知道更好的方法吗?
由于
答案 0 :(得分: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
。