首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用libzip打开拉链

如何用libzip打开拉链
EN

Stack Overflow用户
提问于 2020-08-30 14:38:46
回答 1查看 476关注 0票数 1

我想打开拉链里面的拉链

代码语言:javascript
复制
#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);

据我所见,并不是一个zip,所以它的seg错误。我尝试过转换,因为我知道tried zip是一个zip文件,但是程序没有看到它。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-30 16:08:45

在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

代码语言:javascript
复制
  // 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_source上下文来创建一个可以打开的zip_source。从理论上讲,更容易实现。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63658565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档