如何检查zip文件中是否存在特定名称的文件夹?

时间:2016-07-15 18:27:26

标签: php php-zip-archive

我有一个zip文件,将使用php ziparchive功能打开,之后我需要检查zip中是否存在文件夹?

例如

I have ABC.zip file. check if there is a sub-folder "xyz" in folder "pqr" inside zip file, so if Extracted it would be ABC / pqr / xyz
Sorry if not explained properly.. 

2 个答案:

答案 0 :(得分:1)

在大多数情况下,您可以使用 ZipArchive::locateName() 方法。 如此简单的解决方案是

$zip = new \ZipArchive();
$zip->open('ABC.zip');
if($zip->locateName('/pqr/xyz/') !== false) {
    // directory exists
}

但是有些档案可能没有在索引中列出目录,即使它们的所有文件都有正确的内部路径。在这种情况下,locateName 将为目录返回 false。

这是修复它的片段。您可以扩展 \ZipArchive 或以您自己的方式使用它。

class MyZipArchive extends \ZipArchive
{
    /**
     * Locates first file that contains given directory
     *
     * @param $directory
     * @return false|int
     */
    public function locateDir($directory)
    {
            // Make sure that dir name ends with slash
            $directory = rtrim($directory, '/') . '/';
            return $this->locateSubPath($directory);
    }

    /**
     * @param $subPath
     * @return false|int
     */
    public function locateSubPath($subPath)
    {
        $index = $this->locateName($subPath);
        if ($index === false) {
            // No full path found
            for ($i = 0; $i < $this->numFiles; $i++) {
                $filename = $this->getNameIndex($i);
                if ($this->_strStartsWith($filename, $subPath)) {
                    return $i;
                }
            }
        }
        return $index;
    }

    /**
     * Can be replaced with str_starts_with() in PHP 8
     *
     * @param $haystack
     * @param $needle
     * @return bool
     */
    protected function _strStartsWith($haystack, $needle)
    {
        if (strlen($needle) > strlen($haystack)) {
            return false;
        }
        return strpos($haystack, $needle) === 0;
    }
}

然后

$zip = new MyZipArchive();
$zip->open('ABC.zip');
if($zip->locateDir('/pqr/xyz/') !== false) {
    // directory exists
}

答案 1 :(得分:0)

我做了一些研究,这是我想出来的,它的工作得非常好,我添加了评论以使其易于理解

<?php
$z = new ZipArchive();
if($z->open('test.zip') === TRUE )
{
    if ($z->locateName('test.php') !== false)
    {
    echo "file exists";
    }else {
        echo "file doesn't exist";
    }
}
else {
    echo 'failed to open zip archive';
}

?>

或者你可以去

$('.container').jScrollPane();

用户将其作为答案发布后更容易删除,所以我也添加了