我有一个将使用 phpziparchive
函数打开的 zip 文件,稍后我需要检查 zip 中是否存在文件夹?
例如,我有一个文件 ABC.zip。xyz
检查 zip 文件内的文件夹中是否有子文件夹pqr
,所以如果提取它会是ABC/pqr/xyz
.
我有一个将使用 phpziparchive
函数打开的 zip 文件,稍后我需要检查 zip 中是否存在文件夹?
例如,我有一个文件 ABC.zip。xyz
检查 zip 文件内的文件夹中是否有子文件夹pqr
,所以如果提取它会是ABC/pqr/xyz
.
在大多数情况下,您可以使用 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
}
我做了一些研究,这就是我想出的效果很好,我添加了评论以使其易于理解
<?php
$zip = new ZipArchive;
$dir = __DIR__ . '/test'; // directory name
$zipFileName = __DIR__ . '/ahmad.zip'; // zip name
$fileName ='ahmad.php'; //file name
// unzip the archive to directory
$res = $zip->open($zipFileName);
if ($res === TRUE) {
$zip->extractTo($dir);
$zip->close();
} else {
echo 'failed, code:' . $res;
}
// search for the file in the directory
$array = (scandir($dir));
if (in_array($fileName, $array)) {
echo "File exists";
}
else {
echo "file doesn't exist";
}
// Delete the directory after the search is done
$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it,
RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
if ($file->isDir()){
rmdir($file->getRealPath());
} else {
unlink($file->getRealPath());
}
}
rmdir($dir);
?>
或者你可以去
<?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';
}
?>
用户将其发布为答案然后删除它要容易得多,所以我也添加了它