Определение размера файла размером более 4 ГБ

StackOverflow https://stackoverflow.com/questions/112897

  •  02-07-2019
  •  | 
  •  

Вопрос

Код в настоящее время делает это, и fgetpos обрабатывает файлы размером более 4 ГБ, но поиск возвращает ошибку, поэтому любая идея, как искать до конца file > 4GB?

fpos_t currentpos;

sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");

fgetpos(fp,&currentpos);
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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top