以小部分读取大型二进制文件

时间:2011-11-12 20:26:55

标签: c++ visual-c++ c++-cli binaryfiles

我想从硬盘中读取一个大小约为4-5GB的文件。但不是一次完整,而是在~100MB的部分顺序。我希望尽可能简单快速,但现在我发现C ++的标准方法不适用于大于2GB的文件。 我使用Visual Studio 2008,C ++ / CLI。有什么建议?我尝试使用CreateFile,ReadFile,但对我来说,它会产生更多问题,而不是真正起作用,或者我使用错误来阅读部分大文件。

编辑:示例代码:

创建句柄

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),对于4GB .iso文件,缓冲区大小为100MB。

3 个答案:

答案 0 :(得分:3)

您可以使用CreateFileCreateFileMappingMapViewOfFile将部分文件映射到流程的地址空间。

答案 1 :(得分:0)

您可以顺序读取文件而不会出现任何问题。

限制是fseek在您想要搜索时使用long参数作为偏移量。如果您没有在文件中重新定位,或者偏移量始终小于2GB,则没有问题。

答案 2 :(得分:0)

ReadFile将处理大于2GB的文件,也许您可​​以重新解释您的问题,以便我们可以帮助您找出您遇到的问题。