Определение размера файла размером более 4 ГБ
Вопрос
Код в настоящее время делает это, и fgetpos обрабатывает файлы размером более 4 ГБ, но поиск возвращает ошибку, поэтому любая идея, как искать до конца file > 4GB
?
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
Решение
Если вы работаете в Windows, вам нужно GetFileSizeEx (MSDN).Возвращаемое значение — 64-битное целое число.
В Linux stat64 (справочная страница) верно.fstat, если вы работаете с ФАЙЛОМ*.
Другие советы
Игнорируйте все ответы, в которых есть цифра «64».В Linux вам следует добавить -D_FILE_OFFSET_BITS=64
к вашему CFLAGS и используйте fseeko
и ftello
функции, которые принимают/возвращают off_t
ценности вместо long
.Это не часть C, а POSIX.Другим (не Linux) системам POSIX могут потребоваться другие параметры, чтобы гарантировать, что off_t
является 64-битным;проверьте свою документацию.
Этот код работает у меня в Linux:
int64_t bigFileSize(const char *path)
{
struct stat64 S;
if(-1 == stat64(path, &S))
{
printf("Error!\r\n");
return -1;
}
return S.st_size;
}
(украдено из руководства glibc)
int fgetpos64 (FILE *stream, fpos64_t *position)
Эта функция аналогична fgetpos, но позиция файла возвращается в переменной типа fpos64_t
на какую позицию указывает.
Если исходники скомпилированы с помощью _FILE_OFFSET_BITS == 64
на 32-битной машине эта функция доступна под именем fgetpos
и так прозрачно заменяет старый интерфейс.
Stat всегда лучше, чем fseek, для определения размера файла, он безопасно не работает с вещами, которые не являются файлами.64-битные файлы — это специфичная для работы вещь, в gcc вы можете поставить «64» в конце команд или заставить его выполнять все стандартные вызовы 64 по умолчанию.Подробности смотрите в руководстве по компилятору.
По крайней мере, в Linux вы можете использовать lseek64 вместо fseek.