如何获得大文件的 zip_stat_t

How can I get zip_stat_t for large files

对于小文件,我可以获得 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 的大小,例如,因为信息结构似乎没有正确存储在 RAM 中?

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

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

为避免此行为,建议检查 zip_stat_index() 的 return 值:

Upon successful completion 0 is returned. Otherwise, -1 is returned and the error information in archive is set to indicate the error.

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

其中 return 是 archivefname 的索引,如果未找到文件,则为 -1

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

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