递归列出存档中的文件

时间:2013-05-13 02:43:55

标签: php archive

我正在创建一个方法来检查上传文件夹中的文件,其中一些文件是存档的( 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目录中的文件。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

虽然这个问题过时,但考虑到前一个答案的愚蠢和无用,我不得不回复。

似乎PHP所做的事情总是非标准且充其量尴尬......

你有权检查第一级。但是,从迭代返回的对象的类型不同,因此在它们上调用foreach将导致失败。

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

从那里,你需要在从(也是继承的)getPathname() sic ,而不是getPathName()获得的资源的路径上创建另一个PharData对象。 docs!)方法。然后你就可以迭代了它......

完整示例:

<?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 />";
    }
?>

当然,如果您的存档中有多个级别,则会导致轻松递归。你将不得不做自己的递归爬虫......

答案 1 :(得分:1)

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

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

foreach (new RecursiveIteratorIterator($archive) as $file) {
    echo $file . "<br />";
}

答案 2 :(得分:-3)

我想到了一些建议,我经常考虑并经常思考:代码将完全按照你的要求去做:仅此而已。

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

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

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