微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用libzip在zip内打开zip

如何解决如何使用libzip在zip内打开zip

我正在尝试在拉链内打开一个拉链

model=myWrapperModel

根据我看到的内容 childzip 未被读取为zip,因此它的段错误。 我尝试进行投射,因为我知道childzip是一个zip文件,但程序无法这样查看

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

解决方法

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

留下了两种可能的情况(假设目标是避免将内部zip提取到文件中)。

1。从未压缩的zip读取。

在大多数情况下,当将一个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);

  // Create zip_t
zip_t child_zip = zip_open_from_source(src,&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,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,&error);
  // work with the child zip

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。