首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取小部件中的大型二进制文件

读取小部件中的大型二进制文件
EN

Stack Overflow用户
提问于 2011-11-12 20:26:55
回答 3查看 1.6K关注 0票数 2

我想从硬盘上读取一个文件,大小可达4-5GB。但不是一蹴而就,而是以部分~100 of为序。我想使它尽可能简单和快速,但现在我看到来自C++的标准方法不会对大于2GB的文件起作用。我使用2008,C++/CLI。有什么建议吗?我试着使用CreateFile,ReadFile,但对我来说,这会造成比实际工作更多的问题,或者我错误地使用它们来读取一个大文件。

编辑:示例代码:

创建句柄

代码语言:javascript
运行
复制
hFile = CreateFile(result,          
                  GENERIC_READ,             
                  FILE_SHARE_READ,          
                  NULL,                     
                  OPEN_EXISTING,            
                  FILE_ATTRIBUTE_NORMAL     
                  |FILE_FLAG_NO_BUFFERING               
                  | FILE_FLAG_OVERLAPPED,
                  0);

阅读

代码语言:javascript
运行
复制
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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-12 20:37:20

您可以在没有任何问题的情况下顺序读取该文件。

其限制是,当您想要查找时,offset使用long参数作为偏移量。如果您没有在文件中重新定位,或者偏移量总是小于2GB,则没有问题。

票数 0
EN

Stack Overflow用户

发布于 2011-11-12 20:31:07

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

票数 3
EN

Stack Overflow用户

发布于 2011-11-12 20:38:44

ReadFile将处理大于2GB的文件,也许您可以重新表述您的问题,这样我们就可以帮助您解决您的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8107327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档