首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C中使用libzip在内存中创建zip文件?

如何在C中使用libzip在内存中创建zip文件?
EN

Stack Overflow用户
提问于 2018-02-13 21:41:04
回答 2查看 2.5K关注 0票数 6

我正在尝试使用libzip直接在内存中创建zip文件,而不是在磁盘上创建文件。我的代码目前非常基础,因为我被困在从zip_source_buffer创建必要的zip_t结构上:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <string.h>
#include <zip.h>

int main(int argc, char *arrv[])
{
    char buffer[65536] = {};
    zip_error_t error;
    zip_source_t *zs = zip_source_buffer_create(buffer, sizeof(buffer), 0, &error);

    int err = zip_source_begin_write(zs);
    printf("%p %d '%s'\n", zs, err, zip_error_strerror(&error)); 
    zip_error_fini(&error);

    zip_t * zip = zip_open_from_source(zs, ZIP_CREATE, &error);
    printf("%p '%s'\n", zip, zip_error_strerror(&error)); 
    zip_error_fini(&error);
}

代码编译并运行,但显示一个错误:

代码语言:javascript
运行
复制
$ ./ztest 
0xdd50a0 0 'No error'
(nil) 'Not a zip archive'

目前还不清楚是否需要begin_write(),但它不会产生错误,如果不使用它,我会得到相同的结果。

我遗漏了什么?谢谢

EN

Stack Overflow用户

发布于 2019-10-15 18:59:31

我的2美分如果有人对此感兴趣的话。

不要忘记在zip_open_from_source之前使用zip_source_keep,因为zip_close将免费提供源代码,但我们想要使用它的内容。

代码语言:javascript
运行
复制
int flags = 0;
zip_error_t error;
zip_source_t *zsmem = zip_source_buffer_create(0, 0, 0, &error);
//we can fill up new zip with an old one (some template, for example)
if (exdata){
    zip_source_begin_write(zsmem);
    zip_source_write(zsmem, exdata, exdata_sz); 
    zip_source_commit_write(zsmem); 
}else
    flags |= ZIP_TRUNCATE;

zip_source_keep(zsmem); //!!
struct zip* arc = zip_open_from_source(zsmem, flags, &error);

//do more stuff adding, removing files , comments, etc

zip_close(arc);

zip_source_open(zsmem);
zip_source_seek(zsmem, 0, SEEK_END);
zip_int64_t sz = zip_source_tell(zsmem);
zip_source_seek(zsmem, 0, SEEK_SET);
zip_source_read(zsmem, outbuffer, sz);
zip_source_close(zsmem);

zip_source_free(zsmem);

send_over_network(outbuffer);
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48768181

复制
相关文章

相似问题

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