我想从硬盘上读取一个文件,大小可达4-5GB。但不是一蹴而就,而是以部分~100 of为序。我想使它尽可能简单和快速,但现在我看到来自C++的标准方法不会对大于2GB的文件起作用。我使用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文件,缓冲区大小是100 me。
发布于 2011-11-12 20:37:20
您可以在没有任何问题的情况下顺序读取该文件。
其限制是,当您想要查找时,offset使用long参数作为偏移量。如果您没有在文件中重新定位,或者偏移量总是小于2GB,则没有问题。
发布于 2011-11-12 20:31:07
您可以使用CreateFile、CreateFileMapping和MapViewOfFile将部分文件映射到进程的地址空间。
发布于 2011-11-12 20:38:44
ReadFile将处理大于2GB的文件,也许您可以重新表述您的问题,这样我们就可以帮助您解决您的问题。
https://stackoverflow.com/questions/8107327
复制相似问题