没有对在 zip 中打开 ZIP 文件的通用支持。在某种程度上,这是因为读取 ZIP 文件需要直接访问数据(通过偏移量查找的能力)。但是,压缩的 ZIP 文件不支持按偏移量读取的功能。读取特定偏移量的唯一方法是倒带 zip_file_t 对象,并跳过字节。
剩下两种可能的情况(假设目标是避免将内部 zip 提取到文件中)。
1.从未压缩的 zip 中读取。
在大多数情况下,当将一个 ZIP 压缩包放入另一个 ZIP 压缩包时,压缩程序会意识到压缩无效,并会使用“存储”方法。在这种情况下,可以使用zip_source_zip 方法创建(可搜索的)zip_source,然后打开
见https://libzip.org/documentation/zip_source.html
// Find index
zip_int64_t child_idx= zip_name_locate(main_zip, "child.zip", flags);
// Create zip_source from the complete child.zip
zip_source_t *src = zip_source_zip(archive, main_zip, child_idx, flags, 0, 0);
// Create zip_t
zip_t child_zip = zip_open_from_source(src, flags, &error);
// work with the child zip
2。解压到内存中。
作为替代方案,假设 ZIP 可以放入内存,请考虑将整个子 zip 读入内存,而不是使用 zip_source 的相同上下文来创建可以打开的 zip_source。理论上,实现起来更简单。
zip_stat (...) ;
N = size_of_child_zip(...) ;
zip_file_t *child_file = zip_fopen(main_zip, "child.zip", flags);
char *buffer = calloc(1, N);
zip_fread(child_file, buffer, N) ;
zip_source = zip_source_buffer_create(buffer, N, ...)
// Create zip_t
zip_t child_zip = zip_open_from_source(zip_source, flags, &error);
// work with the child zip