讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么在不解压的情况下快速检索ZIP压缩包内的文件名列表【详解】

秋宇姑娘_9703

秋宇姑娘_9703

发布时间:2026-04-03 10:11:12

|

990人浏览过

|

来源于php中文网

原创

libzip 可直接读取 ZIP 中央目录获取文件名列表而无需解压;需用 zip_open() 打开、zip_get_num_entries() 获取条目数、zip_get_name() 逐个提取,注意错误检查与边界判断。

c++怎么在不解压的情况下快速检索zip压缩包内的文件名列表【详解】

用 libzip 直接读取 ZIP 中央目录,不解压获取文件名列表

ZIP 文件结构本身支持“只读中央目录”,无需解压任何内容就能列出所有文件名。关键不是靠系统命令或临时解压,而是用支持随机读取 ZIP 格式的库——libzip 是最稳定、跨平台、被 cmake 和 pkg-config 广泛集成的选择。

常见错误是试图用 std::ifstream 手动解析 ZIP 结构:ZIP 中央目录位置不固定(可能在末尾带额外数据),且需处理 ZIP64 扩展、签名验证、编码(如 UTF-8 vs CP437),极易出错或漏文件。

  • 安装时优先用包管理器:apt install libzip-dev(Ubuntu)、brew install libzip(macOS)
  • 编译链接加 -lzip,CMake 中用 find_package(libzip REQUIRED) + target_link_libraries(... zip)
  • 必须检查 zip_open() 返回值,返回 NULL 时调用 zip_error_strerror() 才能看到真实原因(比如文件被占用、权限不足、非 ZIP 格式)

zip_get_num_entries() 和 zip_get_name() 的正确调用顺序

不能跳过条目数量直接循环;也不能对空字符串或 NULL 返回值不做判断就 printf。libzip 的 zip_get_name() 在索引越界或内部错误时返回 NULL,但不会崩溃——前提是先确认总条目数。

示例核心逻辑:

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

立即学习“C++免费学习笔记(深入)”;

zip_t *za = zip_open("archive.zip", 0, &err);
if (!za) { /* 错误处理 */ }
int n = zip_get_num_entries(za, 0); // 第二个参数为 0 表示不包含 ZIP 文件自身(即不递归子 ZIP)
for (int i = 0; i < n; i++) {
    const char *name = zip_get_name(za, i, 0); // 最后一个参数为 0 表示原始编码(通常 UTF-8)
    if (name) printf("%s\n", name);
}
zip_close(za);
  • zip_get_num_entries(za, ZIP_FL_UNCHANGED) 可绕过重新扫描,但仅适用于刚打开、未做任何修改的 ZIP
  • zip_get_name() 第三个参数若传 ZIP_FL_ENC_UTF_8,会在名称含非 ASCII 字符且源 ZIP 声明了 UTF-8 标志时生效;否则仍按原始字节返回
  • Windows 上路径分隔符统一为 /(ZIP 规范强制),无需替换 \

为什么不用 minizip 或 zlib 原生接口?

zlib 本身不支持 ZIP 文件结构解析,它只处理 DEFLATE 流;而 minizip(尤其是旧版)缺乏对 ZIP64、数据描述符、加密条目的健壮处理,且 API 易误用(例如 unzGoToFirstFile() 后必须配对 unzGoToNextFile(),漏调用会导致后续读取错位)。

  • libzip 将 ZIP 当作“只读容器”设计,zip_open() 内部自动定位中央目录、校验 EOCD(End of Central Directory)偏移,兼容性远高于手写解析
  • 若项目已用 CMake,FetchContent_Declare(zip URL "...") 可直接拉取最新 libzip 源码编译,避免系统库版本过旧(如 Ubuntu 20.04 自带的 libzip 1.5.1 不支持某些 ZIP64 边界情况)
  • 不推荐用 system("unzip -l archive.zip"):启动进程开销大、输出格式不稳定(列宽变化、含 summary 行)、无法获取原始编码名、无错误码区分“文件不存在”和“密码错误”

遇到中文文件名乱码或显示为空怎么办

不是编码转换问题,而是 ZIP 创建时未设置通用位标志(General Purpose Bit 11)。libzip 默认按原始字节返回名称,如果压缩工具(如旧版 Windows 资源管理器)用了 CP936 但没设 UTF-8 标志,zip_get_name() 就会返回 GBK 编码的字节流——此时强行 reinterpret_cast 成 UTF-8 字符串必然乱码。

  • 先用 zip_file_extra_field_get(za, i, ZIP_EXTRA_FIELD_GLOBAL, &len, 0) 检查是否含 ZIP64 扩展或 UTF-8 标志位,但更实际的做法是:用 file archive.zip 看输出是否含 UTF-8 字样
  • 若确认是 GBK 编码且必须显示,可用 iconv 库转码,但注意:libzip 不提供内置转码函数,也**不建议**在核心路径中引入复杂字符处理
  • 真正可靠的解法是控制上游:让压缩方使用 7z a -mcu=on archive.zip ... 或 zip -U(Info-ZIP 3.0+)显式启用 UTF-8

ZIP 文件名检索快慢几乎只取决于中央目录大小(通常几 KB),和压缩包体积无关。真正卡住的往往是磁盘 I/O(比如网络挂载盘)或错误地尝试读取每个文件头——只要坚持只调 zip_get_name(),几百 MB 或几个 GB 的 ZIP 都能在毫秒级返回全部文件名。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

708

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1009

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1638

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2464

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5944

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5289

2023.11.24

PixPix官网入口合集
PixPix官网入口合集

本专题汇总了PixPix官网在线使用入口及平台功能详解,涵盖文生图、图生图、AI图片编辑、AI视频创作等核心能力,并整理了AI爆款图片复刻、商品套图、详情页生成、视频变清晰与去水印等电商专项工具的使用教程。同时收录了PixPix MCP接入Codex、Claude Code等主流Agent的操作指南,助您一站式完成AI图片与视频创作。

0

2026.10.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn