0

对于小文件,我可以获得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))会导致分段错误。

4

1 回答 1

2

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

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

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

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);

如果没有找到文件,则返回其中的索引fnamearchive-1

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

int zip_stat(struct zip *archive, const char *fname, int flags, struct zip_stat *sb);
于 2020-09-09T21:24:07.350 回答