Определение размера файла больше 4 ГБ - PullRequest
8 голосов
/ 22 сентября 2008

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

fpos_t currentpos;

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

fgetpos(fp,&currentpos);
m_filesize=currentpos;

Ответы [ 6 ]

9 голосов
/ 03 августа 2010

Не обращайте внимания на все ответы с появлением «64». В Linux вы должны добавить -D_FILE_OFFSET_BITS=64 к вашим CFLAGS и использовать функции fseeko и ftello, которые принимают / возвращают значения off_t вместо long. Это не часть C, а POSIX. Другие (не Linux) системы POSIX могут нуждаться в других параметрах, чтобы гарантировать, что off_t является 64-битным; проверьте свою документацию.

6 голосов
/ 22 сентября 2008

Если вы в Windows, вам нужно GetFileSizeEx (MSDN) . Возвращаемое значение - 64-битное целое.

В Linux stat64 (manpage) правильно. fstat если вы работаете с ФАЙЛОМ *.

3 голосов
/ 22 сентября 2008

Этот код работает для меня в 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;
}
2 голосов
/ 22 сентября 2008

Stat всегда лучше, чем fseek, чтобы определить размер файла, он может безопасно работать с вещами, которые не являются файлами. Размеры 64-битных файлов - это специфическая операция, в gcc вы можете поставить «64» в конце команд, или вы можете заставить все стандартные вызовы выполнять по умолчанию 64. Подробности смотрите в руководстве к вашему компилятору.

2 голосов
/ 22 сентября 2008

(украдено из руководства glibc)

int fgetpos64 (FILE *stream, fpos64_t *position)

Эта функция похожа на fgetpos, но позиция файла возвращается в переменной типа fpos64_t, на которую указывает точка.

Если исходные коды скомпилированы с _FILE_OFFSET_BITS == 64 на 32-битном компьютере, эта функция доступна под именем fgetpos и поэтому прозрачно заменяет старый интерфейс.

1 голос
/ 22 сентября 2008

В Linux, по крайней мере, вы можете использовать lseek64 вместо fseek.

...