如何使用 libzip 打开 zip 中的 zip

How do I open a zip within a zip with libzip

我正在尝试打开 zip 中的 zip

#include "zip.h"
#include "gtk.h"

zip_t *mainzipfile = zip_open(g_file_get_path(file), ZIP_CHECKCONS, &error);
zip_file_t *childzip = zip_fopen(mainzipfile, "child.zip", ZIP_RDONLY);// this segfaults
zip_file_t *childofchild = zip_fopen_index((zip_t*)childzip, 1, ZIP_RDONLY);

据我所见,childzip 未被读取为 zip,因此它的段错误。 我尝试转换是因为我知道 childzip 是一个 zip 文件,但程序无法将其视为

如何将 zip_file_t 设置为 zip_t 以便我也可以提取其子项

不支持在 zip 文件中打开 ZIP 文件。在某种程度上,这是因为读取 ZIP 文件需要直接访问数据(通过偏移量查找的能力)。但是,压缩的 ZIP 文件不支持按偏移量读取的功能。读取特定偏移量的唯一方法是倒回 zip_file_t 对象,并跳过字节。

剩下两种可能的情况(假设目标是避免将内部 zip 解压到文件中)。

1.从未压缩的 zip 中读取。

在大多数情况下,当一个ZIP压缩包被放入另一个ZIP压缩包时,zip程序会意识到压缩不会生效,并会使用'store'方法。在那些情况下,可以使用 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