我试图在一个需要在不同文件中存档几个数据块的程序中使用libzip。目前,我有一个类似于下面的代码片段,它是从libzip示例中的in-memory.c示例中编辑的。
zip文件与文件一起正确保存,但每个文件都包含垃圾。任何帮助都是非常感谢的。
bool push_files(zip_t* za) {
for (int i = 0; i < 10; i++) {
// Generate data
std::stringstream ss;
ss << "Test file #" << i;
std::string a = ss.str();
zip_source_t* source = zip_source_buffer(za, a.c_str(), a.size(), 0);
if (source == NULL) {
std::cerr << "error creating source: " << zip_strerror(za) << std::endl;
return false;
}
// Add buffer with filename
std::stringstream fname;
fname << "TEST-" << i;
a = fname.str();
if (zip_file_add(za, a.c_str(), source, ZIP_FL_ENC_UTF_8) < 0) {
std::cerr << "error adding source: " << zip_strerror(za) << std::endl;
return false;
}
}
return true;
}
int main() {
zip_source_t* src;
zip_error_t error;
zip_t* za;
zip_error_init(&error);
if ((src = zip_source_buffer_create(NULL, 0, 1, &error)) == NULL) {
std::cerr << "can't create source: " << zip_error_strerror(&error) << std::endl;
zip_error_fini(&error);
return 1;
}
if ((za = zip_open_from_source(src, ZIP_TRUNCATE, &error)) == NULL) {
std::cerr << "can't open zip from source: " << zip_error_strerror(&error) << std::endl;
zip_source_free(src);
zip_error_fini(&error);
return 1;
}
zip_error_fini(&error);
zip_source_keep(src);
if (!push_files(za))
return -1;
if (zip_close(za) < 0) {
std::cerr << "can't close zip archive" << zip_strerror(za) << std::endl;
return 1;
}
// ... omissis, save archive to file as in in-memory.c
}发布于 2022-09-22 20:33:55
zip_source_buffer不会将数据复制到缓冲区之外--它只是创建一个指向同一个缓冲区的zip_source_t。因此,必须使缓冲区保持活动状态,直到添加完该文件为止。
您的代码不能使缓冲区保持活动状态。您使用的缓冲区是a.c_str(),它是字符串a的数据缓冲区。到目前为止还算公平。但是在添加文件之前,重新分配变量a = fname.str(); (可能)释放该缓冲区并分配一个新的缓冲区。
解决方案:为文件名使用单独的变量。在文件被添加之前,不要覆盖a。
https://stackoverflow.com/questions/73820283
复制相似问题