阅读:1584回复:2
WIN2K下如何控制读文件缓冲的大小?
WINDOWS在读磁盘上的一个文件时,实际读出的值远远不止所需要读取的数量,超出的部分被保存在\"文件缓冲\"区内,当下次对文件进行读操作时,数据可以直接从内存中调取而不是从硬盘中读取,以提高访问速度。
现在这个\"文件缓冲\"给我的应用带来麻烦了。我需要\"同时\"从64个磁盘文件中各读取1M字节数据,组织后通过PCI卡输出。而读取两个文件的时间间隔只有200MS左右,在正常的读过程中,200MS足以读出数据,而在一个文件刚刚被打开第一次读的时候,200MS却解决不了问题。分析原因,应该是第一次读文件,读出的不是1M字节而是\"X\"M,而就是这额外的数据消耗了我宝贵的时间。 除了前面的1M是我所需要的,后面的数据都被装入了缓冲,而以后再读数据,则只是从缓冲中读1M,然后WINDOWS从磁盘中补读缓冲中被移走的那1M数据。 在WIN98中,可以通常在SYSTEM.INI中设置文件缓冲的大小,而在WIN2K里,却没有相关的设置,甚至于我连读了多少数据进缓冲区都不知道。 有什么办法可以解决吗? |
|
|
沙发#
发布于:2003-10-29 12:50
CreateFile:
FILE_FLAG_NO_BUFFERING |
|
板凳#
发布于: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); } |
|
|