如何通过PHP ZipArchive获取压缩包内文件数量及文件名
ZipArchive解压时获取压缩包内文件总数、文件名的实现方案
不需要修改原有解压、删原包的核心逻辑,利用ZipArchive自带的原生属性和方法,在打开压缩包后遍历条目就能拿到需要的数据,比解压后再扫描磁盘目录性能更高。
核心API说明
$zip->numFiles:ZipArchive实例的公开属性,返回压缩包内所有条目(包含文件、文件夹)的总数量$zip->getNameIndex($index):传入条目的索引(从0开始计数),返回对应条目的完整名称/包内相对路径
可直接替换的完整代码
$zip = new \ZipArchive(); // 初始化文件计数、文件名存储数组 $totalFiles = 0; $fileNames = []; if ($zip->open(realpath($path_storage)) === TRUE) { // 遍历压缩包内所有条目 for ($i = 0; $i < $zip->numFiles; $i++) { $entryName = $zip->getNameIndex($i); // 过滤目录条目:压缩包内目录条目默认以/结尾,不计入文件统计 if (!str_ends_with($entryName, '/')) { $totalFiles++; $fileNames[] = $entryName; } } // 原有解压、删除原压缩包逻辑保持不变 $zip->extractTo(realpath(Storage::disk('public')->path($path))); $zip->close(); Storage::disk('public')->delete($path . $name_file . '.' . $extension); // 此处可直接调用两个变量: // $totalFiles 为压缩包内的文件总数量 // $fileNames 为索引数组,包含所有文件在包内的相对路径/名称 }
补充说明
- 如果你需要把压缩包内的文件夹也纳入统计、保留文件夹路径,直接去掉过滤目录的判断逻辑即可
- 如果你的PHP版本低于8.0,不支持
str_ends_with函数,可以把判断条件替换为substr($entryName, -1) !== '/',效果完全一致 - 遍历逻辑在解压前执行,全程在内存中读取压缩包索引,不会产生额外的磁盘IO开销
内容的提问来源于stack exchange,提问作者Agustín Tamayo Quiñones
相关产品推荐
相关产品推荐

