You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:54:21