在日常的 C++ 后台开发工作中,很少会动态生成 Zip 包,所以对 C++ 的 libzip 并不熟悉。最近刚好有个场景,需要将后台生成的一份数据压缩为一个 Zip 包以便下载。这里其实之前已经有生成 Zip 包的代码,只是需要在 Zip 包里面增加一个文件。本来是一个简单的需求,但是实现中遇到了一个诡异的问题,解压生成的 Zip 包里,里面文件开头部分有错乱。
包含完整的:
1
araraloren 2023-10-20 10:24:07 +08:00
Why not using tar ball, it is simpler than zip.
|
2
xuelang OP @araraloren 之前历史协议就是定的 zip ,改的话需要很多地方适配
|
3
okakuyang 2023-10-20 11:42:38 +08:00 via iPhone
是不是字符编码问题导致的呢?纯英文会不会有问题?
|
4
ysc3839 2023-10-20 11:45:50 +08:00 via Android 1
省流:foreach 遍历时没加引用,把数据拷了一份,然后添加到 libzip 的结构中,循环过后数据被释放,但是 libzip 之后还会读这些数据,于是就出问题了。
|
7
03 2023-10-20 12:31:52 +08:00
试过 address sanitizer 吗,似乎是典型场景
|
8
maokabc 2023-10-20 12:33:39 +08:00 via Android
之前给 libzip 做过 jni 封装,给 source 添加数组数据时自己 malloc 一次(然后不管它,zip_close 时会释放 source ,source 释放时又会释放内部 in/out)。
|
9
Jirajine 2023-10-20 13:06:53 +08:00 via Android
多写点 rust 你会对接口的生命周期要求很敏感。
|
13
cnbatch 2023-10-20 13:38:12 +08:00 1
其实可以用 libarchive 嘛,连微软都用
最起码的,它的文档够清晰 |
16
Jirajine 2023-10-20 13:53:35 +08:00 via Android 1
@xuelang #12 你去试试就知道了,rust 对 cpp 程序员完全是无痛的。
rust 的引用把生命周期包含在类型系统当中,你遇到的这个问题放 rust 里就是编译时错误,rust 写多了再用回裸指针没了编译器保护反而也会格外关注生命周期的正确性。 |
18
cnbatch 2023-10-20 13:57:59 +08:00 1
@ysc3839 那就要自己裁剪了,没办法配置成只支持某种格式
libarchive 原本只是 FreeBSD 的内部库,只不过开发团队单独提取出来给大家用,这么来看的话不太可能提供靠配置选格式支持的功能 我在 FreeBSD 编译过使用 libarchive 的程序,发现这个库确实是内置的 Windows 的话,我发现自 2023 年 9 月更新后,Win11 内置了 archiveint.dll ,位置是 C:\Windows\System32\archiveint.dll ,或许链接到这个 DLL 有助于降低 exe 的大小(具体能不能我也不知道,还没试) |
22
cnbatch 2023-10-20 16:41:17 +08:00 1
|