网站大量收购独家精品文档,联系QQ:2885784924

利用OverlappedIO读取文件.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
利用OverlappedIO读取文件

从网上整理的文章,同样,这只是为了我增加理解记忆而做到得笔记,不存在利用价值,纯粹是学习和记忆.抄袭也好学习也好只是让人明白道理.主要干活的还是自己的程序.I/O设备处理必然让主程序停下来干等I/O的完成,对这个问题有方法一:使用另一个线程进行I/O。这个方案可行,但是麻烦。方法二:使用overlapped I/O。? 正如书上所说:“overlapped I/O是WIN32的一项技术,??? 你可以要求操作系统为你传送数据,并且在传送完毕时通知你。??? 这项技术使你的程序在I/O进行过程中仍然能够继续处理事务。??? 事实上,操作系统内部正是以线程来I/O完成overlapped I/O。??? 你可以获得线程的所有利益,而不需付出什么痛苦的代价”。??? 怎样使用overlapped I/O:进行I/O操作时,指定overlapped方式使用CreateFile (),将其第6个参数指定为FILE_FLAG_OVERLAPPED,就是准备使用overlapped的方式构造或打开文件;如果采用 overlapped,那么ReadFile()、WriteFile()的第5个参数必须提供一个指针,指向一个OVERLAPPED结构。 OVERLAPPED用于记录了当前正在操作的文件一些相关信息。//功能:从指定文件的1500位置读入300个字节int main(){??? BOOL rc;??? HANDLE hFile;??? DWORD numread;??? OVERLAPPED overlap;??? char buf[512];??? char szPath=”x:\\xxxx\xxxx”;??? ??? //检查系统,确定是否支持overlapped,(NT以上操作系统支持OVERLAPPED)??? CheckOsVersion();??? // 以overlapped的方式打开文件??? hFile = CreateFile( szPath,??????????????????? GENERIC_READ,??????????????????? FILE_SHARE_READ|FILE_SHARE_WRITE,??????????????????? NULL,??????????????????? OPEN_EXISTING,??????????????????? FILE_FLAG_OVERLAPPED,??????????????????? NULL??????????????? );??? // OVERLAPPED结构实始化为0??? memset(overlap, 0, sizeof(overlap));??? //指定文件位置是1500;??? overlap.Offset = 1500;??? ??? rc = ReadFile(hFile,buf,300,numread,overlap);??? //因为是overlapped操作,ReadFile会将读文件请求放入读队列之后立即返回(false),??? //而不会等到文件读完才返回(true)??? if (rc)??? {?????? //文件真是被读完了,rc为true?????? // 或当数据被放入cache中,或操作系统认为它可以很快速地取得数据,rc为true??? }??? else??? {??????? if (GetLastError() == ERROR_IO_PENDING)??????? {//当错误是ERROR_IO_PENDING,那意味着读文件的操作还在进行中???????? //等候,直到文件读完??????????? WaitForSingleObject(hFile, INFINITE);??????????? rc = GetOverlappedResult(hFile,overlap,numread,FALSE);??????????? //上面二条语句完成的功能与下面一条语句的功能等价:??????????? // GetOverlappedResult(hFile,overlap,numread,TRUE);???????? }???????? else???????? {??????????? //出错了??????? }??? }??? CloseHandle(hFile);??? return EXIT_SUCCESS;}在实际工作中,若有几个操作同一个文件时,怎么办?我们可以利用OVERLAPPED结构中提供的event来解决上面遇到的问题。注意,你所使用的event对象必须是一个MANUAL型的;否则,可能产生竞争条件。原因见书P159。int main(){??? int i;??? B

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档