#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. Если вы не возражаете, я оставлю ответ, поскольку это может быть полезно для других читателей (у которых действительно может возникнуть незамеченная ошибка из-за отсутствия проверки возвращаемого значения).