lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1584回复:2

WIN2K下如何控制读文件缓冲的大小?

楼主#
更多 发布于:2003-10-28 23:01
    WINDOWS在读磁盘上的一个文件时,实际读出的值远远不止所需要读取的数量,超出的部分被保存在\"文件缓冲\"区内,当下次对文件进行读操作时,数据可以直接从内存中调取而不是从硬盘中读取,以提高访问速度。
    现在这个\"文件缓冲\"给我的应用带来麻烦了。我需要\"同时\"从64个磁盘文件中各读取1M字节数据,组织后通过PCI卡输出。而读取两个文件的时间间隔只有200MS左右,在正常的读过程中,200MS足以读出数据,而在一个文件刚刚被打开第一次读的时候,200MS却解决不了问题。分析原因,应该是第一次读文件,读出的不是1M字节而是\"X\"M,而就是这额外的数据消耗了我宝贵的时间。
    除了前面的1M是我所需要的,后面的数据都被装入了缓冲,而以后再读数据,则只是从缓冲中读1M,然后WINDOWS从磁盘中补读缓冲中被移走的那1M数据。
    在WIN98中,可以通常在SYSTEM.INI中设置文件缓冲的大小,而在WIN2K里,却没有相关的设置,甚至于我连读了多少数据进缓冲区都不知道。
    有什么办法可以解决吗?
lvhaow
yymrhxf
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2011-10-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-29 12:50
CreateFile:

FILE_FLAG_NO_BUFFERING
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-10-29 21:53
楼上的兄弟,谢谢您的指点。
我写了段代码做测试,发现了个有意思的现象,就是在READFILE的时候,只要指定FILE_FLAG_NO_BUFFERING,那么保存读出字节数的readednumb的值就始终为0,但读出的数据是正确的。不知道这个现象背后是不是有什么潜在的问题。
(先送分致谢)

void CTestfileDlg::OnButton1()
{
  HANDLE hFile;
  hFile=CreateFile(\"E:\\\\TEST.DAT\",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,NULL);
  GetFileInformationByHandle(hFile,&fileInformation[1]);
  BYTE * lpBase =(BYTE * ) VirtualAlloc (NULL, 10485760, MEM_RESERVE, PAGE_NOACCESS);//保留10M字节虚拟内存
  BYTE * lpPageUes =(BYTE * ) VirtualAlloc (lpBase,10485760,MEM_COMMIT,PAGE_READWRITE);//使用保留的内存

  DWORD readednumb;
  OVERLAPPED overlapped;
  overlapped.hEvent=CreateEvent(0,TRUE,FALSE,NULL);
  overlapped.Offset =0;
  overlapped.OffsetHigh=0;
  ResetEvent(overlapped.hEvent);
  ReadFile(hFile,lpPageUse,10485760,&readednumb,&overlapped);
  DWORD refl;
  refl=WaitForSingleObject(overlapped.hEvent,1000);
  if(refl==WAIT_TIMEOUT)
  {
    MessageBox(\"超时\",NULL,MB_OK);
  }
  else
  {
    MessageBox(\"读取成功\",NULL,MB_OK);
  }
  ResetEvent(overlapped.hEvent);
  CloseHandle(hFile);
  VirtualFree(lpBase,10485760,MEM_DECOMMIT);
}
lvhaow
游客

返回顶部