C: чтение файлов размером> 4 ГБ - PullRequest
4 голосов
/ 03 июля 2011

У меня есть какой-то ридер, у которого есть только дескриптор (FILE *) файла. Другой процесс продолжает запись в тот же файл, который я не могу контролировать.

Теперь, когда другой процесс добавляет изображения в этот файл, вполне вероятно, что вскоре размер файла превысит ограничение 4 ГБ.

Процесс чтения читает этот файл, используя дескриптор, смещение и длину файла изображения, который можно найти в некоторой БД.

У меня вопрос, как читатель сможет прочитать фрагмент из файла, который будет представлен после размера 4 ГБ.

Я работаю на машине с Win32.

EDIT: Я также работаю на машине с FreeBSD.

Ответы [ 2 ]

5 голосов
/ 03 июля 2011

Просто используйте стандартный C API в Windows, fread, fwrite отлично работают с большими файлами.Вам потребуется _fseeki64 для поиска 64-битной позиции.

Вы также можете использовать простой WinAPI (ReadFile и т. Д.), Который также может без проблем работать с> 4 ГиБ-файлами.

[Edit]: Единственное, что вам действительно нужно, - это 64-битный поиск, который ReadFile обеспечивает через структуру OVERLAPPED (как упоминали некоторые комментаторы). Конечно, вы также можете получить, используя SetFilePointer, что эквивалентно _fseeki64.Чтение / запись никогда не является проблемой, независимо от размера файла, только поиск.

2 голосов
/ 19 июля 2011

В FreeBSD API-интерфейс stdio не ограничен 32 битами (4 ГБ).

У вас не должно возникнуть проблем при чтении последних 4 Гб, если вы используете 64-битное целое число для управления смещениями и длинами.

Если вы ищете файл FILE *, вам придется использовать fseeko (), а не fseek (), если вы используете 32-битный хост.fseek () занимает 32 бит на 32 битных машинах.fseeko () принимает тип off_t, который равен 64 битам на всех архитектурах FreeBSD.

...