首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libzip无法关闭文件

libzip无法关闭文件
EN

Stack Overflow用户
提问于 2014-07-14 14:56:03
回答 1查看 847关注 0票数 0

目前,我正在使用C++11程序中的libzip提取压缩文件的内容,并将其存储到数据结构中,该数据结构还将保存与文件相关的元数据。

我正在使用当前的方法来爆炸zip文件并获取其中每个文件的内容:

代码语言:javascript
复制
void explodeArchive(const string& path, vector<ZipFileModel>& files) {
    int error = 0;
    zip *zip = zip_open(path.c_str(), 0, &error);
    if (zip == nullptr) {
      throw logic_error("Could not extract content of file " + path);
    }
    const zip_int64_t n_entries = zip_get_num_entries(zip, ZIP_FL_UNCHANGED);
    for (zip_int64_t i = 0; i < n_entries; i++) {
      const char *file_name = zip_get_name(zip, i, ZIP_FL_ENC_GUESS);
      struct zip_stat st;
      zip_stat_init(&st);
      zip_stat(zip, file_name, ZIP_FL_NOCASE, &st);
      char *content = new char[st.size];
      std::cerr << file_name << std::endl;
      zip_file *file = zip_fopen(zip, file_name, ZIP_FL_NOCASE);
      const zip_int64_t did_read = zip_fread(file, content, st.size);
      if (did_read <= 0) {
        continue;
      }
      if (strlen(content) < st.size) {
        LOG(WARNING)<< "File " << file_name << " is truncated.";
      }
      if (strlen(content) > st.size) {
        content[st.size] = '\0';
      }

      ZipFileModel model;
      model.name = string(file_name);
      model.content = string(content);
      model.order = -1;
      files.push_back(model);

      zip_fclose(file);
      delete[] content;
    }
    zip_close(zip);
  }

我的问题是,当gdb指向zip_fclose(file);时,我会得到随机分段错误。

代码语言:javascript
复制
Program received signal SIGSEGV, Segmentation fault.
0x00000001001ef8a0 in zip_source_close (src=0x105001b00) at /Users/xxx/Projects/xxx/xxx/src/libzip/zip_source_close.c:48
48      (void)src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_CLOSE);

对此进行调试的最佳方法是什么?正如我所说,这是间歇性的,所以很难确定确切的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-26 01:38:21

当没有什么可读的时候,您不能关闭zip_file。

首先,在里面打开文件:

代码语言:javascript
复制
zip_file *file = zip_fopen(zip, file_name, ZIP_FL_NOCASE);

然后试着读一些东西:

代码语言:javascript
复制
  const zip_int64_t did_read = zip_fread(file, content, st.size);

如果没有什么可读的,您继续,文件永远不会关闭。

代码语言:javascript
复制
  if (did_read <= 0) {
    continue;
  }

所以,只需加上:

代码语言:javascript
复制
if (did_read <= 0) {
    zip_fclose(file);
    continue;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24739477

复制
相关文章

相似问题

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