Php 递归地列出存档中的文件

Php 递归地列出存档中的文件,php,archive,Php,Archive,我正在创建一个方法来检查上传文件夹中的文件,其中一些文件是归档文件(tar、tar.gz、zip、rar等)。我想阅读这些存档文件,并以嵌套树格式列出所有文件 例如,我有一个名为sandwich.tar.gz的归档文件,我希望它如下所示:- sandwich.tar.gz lettuce mayonaise cheese bread (directory) wholemeal 到目前为止,我的代码是:- <?php $archive = n

我正在创建一个方法来检查上传文件夹中的文件,其中一些文件是归档文件(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 />";
}

我想到了一些曾经给过我并经常思考的建议:代码将完全按照您的要求执行:不多不少

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

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


考虑一下,我脑海中浮现出一些曾经给过我的建议,这些建议我经常思考:代码将完全按照您的要求执行:不多不少

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

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


考虑和

尽管这个问题已经过时,但考虑到前面的答案既愚蠢又无用,我不得不回答

似乎PHP做的任何事情都是非标准的,充其量也是笨拙的

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

对一个对象进行迭代会得到一个。从那里可以检查文件类型(检查它是否是具有继承方法的目录)

从这里开始,您需要在从(同样继承的)(sic,而不是
getPathName()
say the docs!)方法获得的资源的路径上创建另一个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 />";
    }
?>


当然,如果您的归档文件中有多个级别,那么这会扼杀简单的递归。你必须自己做一个递归爬虫…

尽管这个问题已经过时了,考虑到前面的答案既愚蠢又无用,我不得不回答

似乎PHP做的任何事情都是非标准的,充其量也是笨拙的

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

对一个对象进行迭代会得到一个。从那里可以检查文件类型(检查它是否是具有继承方法的目录)

从这里开始,您需要在从(同样继承的)(sic,而不是
getPathName()
say the docs!)方法获得的资源的路径上创建另一个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 />";
    }
?>


当然,如果您的归档文件中有多个级别,那么这会扼杀简单的递归。您必须自己制作递归爬虫程序…

您可以使用
RecursiveIteratoryIterator
,因为
PharData
扩展了
Phar
类,而
Phar
类扩展了
RecursiveDirectoryIterator
类:

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

foreach (new RecursiveIteratorIterator($archive) as $file) {
    echo $file . "<br />";
}
$archive=newphardata('/upload/directory/sandwich.tar.gz');
foreach(新的递归迭代器($archive)作为$file){
echo$文件。“
”; }
您可以使用
递归迭代器
执行此操作,因为
PharData
扩展了
Phar
类,而
Phar
类扩展了
RecursiveDirectoryIterator
类:

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

foreach (new RecursiveIteratorIterator($archive) as $file) {
    echo $file . "<br />";
}
$archive=newphardata('/upload/directory/sandwich.tar.gz');
foreach(新的递归迭代器($archive)作为$file){
echo$文件。“
”; }
问题是关于读取tar存档,而不是简单目录。问题是关于读取tar存档,而不是简单目录。