我想从硬盘中读取一个大小约为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。
答案 0 :(得分:3)
您可以使用CreateFile,CreateFileMapping和MapViewOfFile将部分文件映射到流程的地址空间。
答案 1 :(得分:0)
您可以顺序读取文件而不会出现任何问题。
限制是fseek在您想要搜索时使用long
参数作为偏移量。如果您没有在文件中重新定位,或者偏移量始终小于2GB,则没有问题。
答案 2 :(得分:0)
ReadFile将处理大于2GB的文件,也许您可以重新解释您的问题,以便我们可以帮助您找出您遇到的问题。