【问题标题】:Recursively list files in an archive递归列出存档中的文件
【发布时间】:2013-05-07 00:30:49
【问题描述】:

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

【问题讨论】:

    标签: php archive


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      PharData 对象上进行迭代会得到PharFileInfo 对象。从那里您可以检查文件类型(检查它是否是继承isDir() 方法的目录)。

      从那里,您需要在从(也继承的)getPathname()sic,而不是 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 />";
          }
      ?>
      

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

        • 问题是关于读取 tar 存档,而不是简单的目录。
        猜你喜欢
        • 2018-10-07
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多