Чтение больших двоичных файлов небольшими частями - PullRequest
2 голосов
/ 13 ноября 2011

Я хочу прочитать файл с жесткого диска размером до ~ 4-5 ГБ.Но не целое сразу, а по частям ~ 100 МБ в последовательности.Я хочу сделать это максимально простым и быстрым, но теперь я вижу, что стандартные методы из C ++ не будут работать для файлов размером более 2 ГБ.Я использую Visual Studio 2008, C ++ / CLI.Какие-либо предложения?Я пытаюсь использовать CreateFile, ReadFile, но для меня это создает больше проблем, чем на самом деле, или я использую их неправильно для чтения большого файла по частям.

EDIT : Пример кода:

Создание дескриптора

hFile = CreateFile(result,          
                  GENERIC_READ,             
                  FILE_SHARE_READ,          
                  NULL,                     
                  OPEN_EXISTING,            
                  FILE_ATTRIBUTE_NORMAL     
                  |FILE_FLAG_NO_BUFFERING               
                  | FILE_FLAG_OVERLAPPED,
                  0);

Чтение

lpOverlapped = new OVERLAPPED;
lpOverlapped->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
lpOverlapped->Offset=10;
lpOverlapped->OffsetHigh=0;
DWORD howMuchWasRead;

BOOLEAN error = false;

do {
    this->lastError = NO_ERROR;
    BOOL bRet = ReadFile(this->hFile,this->fileBuffer,this->currentBufferSize,&howMuchWasRead,lpOverlapped);
    this->lastError = GetLastError(); 
    if (this->lastError == ERROR_IO_PENDING){
        while(!HasOverlappedIoCompleted(this->lpOverlapped)){}
        error = true;
    } else {
        error = false;
    }
} while (error == true);

Эта версия теперь возвращает мне ERROR_INVALID_PARAMETER 87 (0x57), для 4 ГБ .isoфайл, размер буфера составляет 100 МБ.

Ответы [ 3 ]

3 голосов
/ 13 ноября 2011

Вы можете отобразить части файла в адресное пространство вашего процесса используя CreateFile , CreateFileMapping и MapViewOfFile .

0 голосов
/ 13 ноября 2011

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

0 голосов
/ 13 ноября 2011

Вы можете читать файл последовательно без каких-либо проблем.

Ограничения: fseek использует параметр long для смещения, когда вы хотите искать. Если вы не меняете положение в файле или смещение всегда меньше 2 ГБ, проблем нет.

...