【问题标题】:How can I get zip_stat_t for large files如何获取大文件的 zip_stat_t
【发布时间】:2020-09-09 20:42:24
【问题描述】:

对于小文件,我可以获得zip_stat_t 信息,但如果它是 40Mb 大的文件,我不能。

zip_stat_t info;
zip_stat_index(zipfile, 544, ZIP_FL_ENC_GUESS, &info);
printf("%s\n", info.name);

例如打印info.name 会导致大文件(例如40mb 文件)出现段错误。一个 2Mb 的文件将毫无问题地打开。我如何获得info.name 的大小,例如,因为似乎 info 结构没有正确存储在 RAM 中?

如果我这样做 printf(strlen(info.name)) 会导致分段错误。

【问题讨论】:

  • 第一个建议是检查 zip_stat_index 的返回值。 “返回-1并设置归档中的错误信息表示错误”from here)。
  • zip_stat_index 返回 0

标签: c sizeof strlen libzip


【解决方案1】:

您遇到的可能是 info 检索失败,因此 name 字段无效导致段错误。文档没有像您遇到的那样提及大小限制。

为避免这种行为,建议检查zip_stat_index()的返回值:

成功完成后返回 0。否则返回-1,并设置archive中的错误信息指示错误。

if (zip_stat_index(zipfile, 544, ZIP_FL_ENC_GUESS, &info) == 0 )
{
    printf("%s\n", info.name);
}

为什么索引检索失败?存档中可能不存在提供给函数的index(在您的情况下为544)。为了防止这种“找不到索引”的问题,你可以使用zip_name_locate ()函数获取给定文件的索引:

int zip_name_locate(struct zip *archive, const char *fname, int flags);

如果找不到文件,则返回archive-1 内的fname 的索引。

或者,您可以只使用zip_stat() 而不是zip_stat_index(),这样可以节省一个步骤,因为它允许请求文件名作为参数:

int zip_stat(struct zip *archive, const char *fname, int flags, struct zip_stat *sb);

【讨论】:

  • 没有索引,它只是索引错误,文件很大
  • zip_stat_t 没有任何问题。问题是printf() 和实例化zip_stat_index 之间的一条线。可能是那个变量弄乱了zip_stat info的内存。我不得不用malloc分配它的内存。原来是char variable[info.size],改成char *variable = malloc(info.size)
  • @BretJoseph 我明白了。文件大小可能会影响 libzip 的行为,这对我来说听起来很奇怪。如果您不介意我将留下答案,因为它可能对其他读者有所帮助(由于缺少对返回值的检查,他们实际上可能有一个未被注意到的错误)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2023-01-11
  • 2023-03-04
相关资源
最近更新 更多