Как я могу получить zip_stat_t для больших файлов

#c #sizeof #strlen #libzip

#c #sizeof #strlen #libzip

Вопрос:

Для небольших файлов я могу получить zip_stat_t информацию, но если это файл размером 40 МБ, я не могу.

 zip_stat_t info;
zip_stat_index(zipfile, 544, ZIP_FL_ENC_GUESS, amp;info);
printf("%sn", info.name);
  

например, печать info.name прерывается для больших файлов, например, файла размером 40 МБ. Файл размером 2 МБ откроется без проблем. Как я могу получить размер info.name , например, поскольку кажется, что информационная структура не хранится должным образом в оперативной памяти?

Если я это сделаю printf(strlen(info.name)) , это приведет к ошибке сегментации.

Комментарии:

1. Первым предложением было бы проверить возвращаемое значение zip_stat_index . «Возвращается -1, а информация об ошибке в архиве установлена для указания ошибки» ( отсюда ).

2. zip_stat_index возвращает 0

Ответ №1:

То, что вы испытываете, вероятно, является сбоем при получении информации, так что name поле было недействительным, что вызвало ошибку segfault. В документации не упоминаются ограничения размера, подобные тем, с которыми вы сталкиваетесь.

Чтобы избежать такого поведения, рекомендуется проверять возвращаемое значение zip_stat_index() :

После успешного завершения возвращается 0. В противном случае возвращается значение -1, и информация об ошибке в архиве устанавливается для указания ошибки.

 if (zip_stat_index(zipfile, 544, ZIP_FL_ENC_GUESS, amp;info) == 0 )
{
    printf("%sn", info.name);
}
  

Почему не удалось получить индекс? Возможно, index предоставленное функции (в вашем случае 544 ) отсутствует в архиве. Чтобы предотвратить такого рода проблемы с «не найден индекс», вы можете получить индекс данного файла с помощью zip_name_locate () функции:

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

который возвращает либо индекс fname внутри archive , либо -1 , если файл не найден.

В качестве альтернативы вы можете просто использовать zip_stat() вместо zip_stat_index() , что экономит один шаг, поскольку позволяет запрашивать имя файла в качестве параметра:

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

Комментарии:

1. индекс отсутствует, он просто выдает ошибку в индексе с файлом, который огромен

2. С zip_stat_t не было ничего плохого. Проблема заключалась в строке между printf() и после создания экземпляра zip_stat_index . Может быть, эта переменная возилась с памятью для zip_stat info . Мне пришлось выделить его память с помощью malloc. Это было char variable[info.size] , изменил его на char *variable = malloc(info.size)

3. @BretJoseph Я вижу. Мне показалось действительно странным, что размер файла может повлиять на поведение libzip. Если вы не возражаете, я оставлю ответ, поскольку это может быть полезно для других читателей (у которых действительно может возникнуть незамеченная ошибка из-за отсутствия проверки возвращаемого значения).