c - 如何从 C 使用 libzip 在内存中创建一个 zip 文件?

标签 c libzip

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

#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);
}

代码编译运行,但报错:

$ ./ztest 
0xdd50a0 0 'No error'
(nil) 'Not a zip archive'

不清楚是否需要 begin_write(),但它不会产生错误,没有它我会得到相同的结果。

我错过了什么?谢谢

最佳答案

如果有人对问题感兴趣,我的 2 美分。

不要忘记在zip_open_from_source之前zip_source_keep,因为zip_close会释放源代码,但我们想使用它的内容。

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);

关于c - 如何从 C 使用 libzip 在内存中创建一个 zip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48768181/

相关文章:

c++ - 使用 --coverage 选项编译时是否定义了任何宏?

c++ - localtime() 和 gmtime() 似乎弄乱了我的输入流 C++/C

c++ - libzip 中的符号链接(symbolic link)

java - Jenkins Java编译导致Java崩溃

创建不需要 DLL 或库的 .exe

c - 为什么我无法输入所需的输入数量?

c - 如何确定两个相似函数的效率更高

c - zlib-1.2.11 是 "too old"- 编译 libzip-1.3.0 需要 1.1.2

android - 使用 libzip 在 zip 中写入文件

c++ - 从压缩文件中提取数据返回随机数据