我正在尝试使用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(),但它不会产生错误,没有它我会得到相同的结果。
我错过了什么?感谢
答案 0 :(得分:0)
使用ZIP_TRUNCATE代替ZIP_CREATE
。在使用缓冲源的情况下,归档文件始终存在,因此ZIP_CREATE
无效,但是流0无效的zip文件。 ZIP_TRUNCATE
告诉libzip忽略缓冲区的当前内容(即用新的归档文件覆盖所有的0)。
zip_source_begin_write()
由libzip内部调用。在这种情况下不必调用它。
答案 1 :(得分:0)
我的2美分,如果有人有兴趣的话。
不要忘记在zip_source_keep
之前zip_open_from_source
,因为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);