2

我正在创建一种方法来检查上传文件夹中的文件,其中一些文件是存档文件(tar、tar.gz、zip、rar 等)。我想阅读这些存档文件并以嵌套树格式列出所有文件。

例如,我有一个名为 的存档文件sandwich.tar.gz,我希望将其列出如下:-

sandwich.tar.gz
    lettuce
    mayonaise
    cheese
    bread (directory)
        wholemeal

到目前为止我的代码: -

<?php $archive = new PharData('/upload/directory/sandwich.tar.gz');
foreach($archive as $file) {
        echo $file . "<br />";
}

但它未能列出目录内的bread文件。我该如何解决?

4

3 回答 3

5

您可以使用 a 来执行此操作RecursiveIteratorIterator,因为PharData扩展了Phar类并且Phar类扩展了RecursiveDirectoryIterator类:

$archive = new PharData('/upload/directory/sandwich.tar.gz');

foreach (new RecursiveIteratorIterator($archive) as $file) {
    echo $file . "<br />";
}
于 2018-01-23T16:13:09.843 回答
2

虽然这个问题比较陈旧,但考虑到上一个答案的愚蠢和无用,我不得不回答。

似乎 PHP 所做的一切都是非标准的,充其量是尴尬的......

检查第一级是对的。但是,迭代返回的对象不是同一类型的,调用foreach它们会导致失败。

迭代一个PharData对象会给你PharFileInfo一个。从那里您可以检查文件类型(检查它是否是具有继承isDir()方法的目录)。

从那里,您需要在从(也是继承的)getPathname()原文如此,而不是getPathName()文档!)方法获得的资源的路径上创建另一个 PharData 对象。然后,您将能够对其进行迭代...

完整示例:

<?php
    $archive = new PharData('/upload/directory/sandwich.tar.gz');
    foreach($archive as $file) {
        echo $file;
        if($file->isDir()) {
            echo ':';
            $dir = new PharData($file->getPathname());
            foreach($dir as $child) {
                echo "<br />$child";
            }
        }
        echo "<br />";
    }
?>

当然,如果您的存档中有多个级别,这会扼杀简单的递归。你将不得不自己做递归爬虫......

于 2016-01-11T11:09:02.730 回答
-3

我曾经得到过一些建议,并且经常想到:代码将完全按照您的要求执行:不多也不少。

询问机器:'如果这是一个目录,请显示内容?'

您的函数认为它正在寻找 $file,因此输出该文件的名称。

考虑http://php.net/manual/en/function.readdir.phphttp://www.php.net/manual/en/function.is-dir.php

于 2013-05-13T03:17:03.650 回答