首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用libzip将多个文件从缓冲区添加到ZIP存档

使用libzip将多个文件从缓冲区添加到ZIP存档
EN

Stack Overflow用户
提问于 2022-09-22 20:24:13
回答 1查看 89关注 0票数 1

我试图在一个需要在不同文件中存档几个数据块的程序中使用libzip。目前,我有一个类似于下面的代码片段,它是从libzip示例中的in-memory.c示例中编辑的。

zip文件与文件一起正确保存,但每个文件都包含垃圾。任何帮助都是非常感谢的。

代码语言:javascript
复制
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
}
EN

Stack Overflow用户

发布于 2022-09-22 20:33:55

zip_source_buffer不会将数据复制到缓冲区之外--它只是创建一个指向同一个缓冲区的zip_source_t。因此,必须使缓冲区保持活动状态,直到添加完该文件为止。

您的代码不能使缓冲区保持活动状态。您使用的缓冲区是a.c_str(),它是字符串a的数据缓冲区。到目前为止还算公平。但是在添加文件之前,重新分配变量a = fname.str(); (可能)释放该缓冲区并分配一个新的缓冲区。

解决方案:为文件名使用单独的变量。在文件被添加之前,不要覆盖a

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

https://stackoverflow.com/questions/73820283

复制
相关文章

相似问题

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