Обработка файлов размером более 2 ГБ в MSVC6! - PullRequest
2 голосов
/ 19 января 2010

Обычные функции, связанные с файлами, такие как fseek, ftell и т. Д. В Windows MSVC6 могут обрабатывать файлы размером до 2 ГБ (согласно моему текущему пониманию, пожалуйста, исправьте меня, если я ошибаюсь).

Я хочу работать с файлами> 2 ГБ. Как я должен идти об этом? Какие функции доступны?

Ответы [ 5 ]

2 голосов
/ 19 января 2010

Я не уверен, но ограничение составляет 4 ГБ, OS API и стандартные библиотеки, использующие эти API и используемую файловую систему.

Функции ftell, fseek используют 32-разрядные целые числа, поэтому вы не сможете обработать файл размером более 4 ГБ. Вы должны будете использовать OS API напрямую.

Таким образом, вы должны быть осторожны, какую функцию вы используете, например, для получения размера файла вы должны использовать функцию ex GetFileSizeEx, поэтому вы должны убедиться, что вы используете функцию, которая использует 64 смещение файла бита. То же самое для SetFilePointerEx

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

1 голос
/ 19 января 2010

Вы можете использовать Windows API для обработки файлов, такие как CreateFile, ReadFile, WriteFile. Это также дает вам возможность иметь перекрывающиеся и неперекрывающиеся операции.

1 голос
/ 19 января 2010

В большинстве случаев вы должны игнорировать все файловые функции, встроенные в стандартную библиотеку, и использовать только функции в Win32 API - например, вместо fwrite или ostream::write вам нужно будет использовать WriteFile. Аналогично, для поиска в файле вам нужно будет использовать SetFilePointer вместо fseek или seekp. Большая часть Win32 API может обрабатывать файлы размером более 4 ГБ - и те немногие, которые не могут заменить, могут обрабатывать файлы большего размера.

1 голос
/ 19 января 2010

Предел, вероятно, исходит от файловой системы.FAT32 имеет ограничение в 4 ГБ, тогда как NTFS имеет гораздо более высокий предел (в терабайтах).

Таким образом, размер файла, который вы можете обрабатывать, будет зависеть от того, в какой файловой системе отформатирован жесткий диск, икакую операционную систему вы используете, хотя вы почти наверняка используете операционную систему, которая может обрабатывать верхние пределы NTFS (Windows 2000 или выше).

0 голосов
/ 11 августа 2010

Это на самом деле 16 ТБ (для тех, кто найдет это в будущем). Я только что создал 6710886400, это 6 ГБ файл с использованием перекрывающегося ввода-вывода - следующий фрагмент показывает, как работать со смещениями ПЕРЕКРЫТЫЙ ол; __int64 fileOffset; ol.hEvent = CreateEvent (0, ИСТИНА, ЛОЖЬ, 0); fileOffset = __int64 (TEST_BUFFER_SIZE) * i; ol.Offset = (DWORD) fileOffset; ol.OffsetHigh = (DWORD) (fileOffset >> 32); printf ("[% d% I64d]", i, fileOffset); результат = WriteFile (hFile, буфер, TEST_BUFFER_SIZE, & writing, & ol);

чтобы получить размер, который я могу выполнить ...

DWORD dwHigh, dwLow =GetFileSize(hFile, &dwHigh);
__int64 FileSizeInBytes = __int64(dwHigh * (MAXDWORD + 1.0L)) + dwLow;

СОВЕТ: Если вы начинаете получать коды ошибок / недопустимых параметров из API, вы, вероятно, путаете математику и передаете отрицательные смещения.

(некоторые невинные переменные и действие политик обработчика исключений были удалены из этого образца для защиты основных прав байтов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...