【问题标题】:retrieve folders names only from a zip file with php?仅从带有 php 的 zip 文件中检索文件夹名称?
【发布时间】:2012-03-28 10:07:09
【问题描述】:

我正在尝试从 zip 文件中检索文件夹名称。 我写了这个简单的函数:

<?php
class zipadmin{
    private $filename ;
    private $folder ;
    public function __construct($filename,$folder){
        $this->zip = new ZipArchive;
        $this->file = $filename ;
        $this->folder = $folder ;
    }
    public function listzip(){
    if ($this->zip->open($this->file) == TRUE) {
        $info = $this->zip->statIndex(0);
        $output = str_replace('/','',$info['name']);
        return $output;
        }
    }
}

如果 zip 文件夹包含文件夹中未包含的其他文件,则会返回所有文件名的问题。 我需要它只返回文件夹名称并丢弃任何文件名。

【问题讨论】:

    标签: php zip


    【解决方案1】:

    您可以尝试检查$info['crc'] 何时等于零。

    class zipadmin{
    
      private $file;
      private $folder;
      private $zip;
    
      public function __construct($filename, $folder) {
        $this->zip = new ZipArchive;
        $this->file = $filename ;
        $this->folder = $folder ;
        }
    
      public function listzip() {
        $res = false;
        if ($this->zip->open($this->folder . $this->file) == TRUE) {
          $i = 0;
          while ($info = $this->zip->statIndex($i)) {
            if ($info['crc'] == 0 && preg_match('#^[^/]*?/$#', $info['name']))
              $res[] = preg_replace('#^([^/]*?)/$#', '$1', $info['name']);
            $i++;
            }
          }
        return $res;
        }
    
    }
    

    用法示例:

    $z = new zipadmin('test.zip', './'); // test.zip in my example is in same folder
    print_r($z->listzip());
    

    输出(仅限根目录数组):

    Array
    (
        [0] => folder1
        [1] => folder2
        [2] => folder3
        [3] => folder4
    )
    

    在我的test.zip 存档中,我在存档的根目录中有几个文件和 4 个目录 folder1folder2folder3folder4,其中包含一些文件和子目录。针对没有文件夹的存档运行方法返回布尔值 false

    更新:

    • 修复了正则表达式模式以匹配第一个斜杠 / 之前的所有内容。

    【讨论】:

    • 警告:ZipArchive::statIndex() [ziparchive.statindex]:无效或未初始化的 Zip 对象
    • 告诉我你传递给__construct方法的参数是什么?确保您的 $folder 参数以斜杠结尾,例如 new zipadmin('myarchive.zip', 'folder/to/archive/');。我刚刚针对不同位置的几个 zip 档案对其进行了测试,它工作正常。
    • 简而言之,您可以提供正确的路径和文件名作为类构造函数的参数。
    • 我确定我传递了正确的参数,当我将它更改为旧参数时它工作得很好:)
    • zip 文件路径是用$this-&gt;folder . $this-&gt;file 定义的,所以这是查找问题的地方。没有人能猜到你在做什么,因为你没有在这里提供任何示例代码,比如你如何使用这个类,它在哪里,你从哪里调用它,你的 zip 文件在哪里。它不起作用的原因有很多,但可以肯定的是,它是错误的 PATH/TO/your.zip
    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多