我有一个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..
答案 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();
用户将其作为答案发布后更容易删除,所以我也添加了