我正在尝试使用libzip在内存中直接创建一个zip文件,而不是在磁盘上创建一个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);
}
Run Code Online (Sandbox Code Playgroud)
代码可以编译并运行,但是会引发错误:
$ ./ztest
0xdd50a0 0 'No error'
(nil) 'Not a zip archive'
Run Code Online (Sandbox Code Playgroud)
尚不清楚是否需要begin_write(),但它不会产生错误,没有它我也会得到相同的结果。
我想念什么?谢谢
使用ZIP_TRUNCATE而不是ZIP_CREATE. 存档始终存在于缓冲区源的情况下,因此ZIP_CREATE没有效果,但“0”流不是有效的 zip 文件。ZIP_TRUNCATE告诉 libzip 忽略缓冲区的当前内容(即用新存档覆盖所有“0”)。
zip_source_begin_write()由 libzip 内部调用。在这种情况下没有必要调用它。