第二中方法,使用缓存的方式:
BOOL FileReverseNoMap(PCTSTR pszPathName) { HANDLE hFile = CreateFile(pszPathName,GENERIC_WRITE|GENERIC_READ,0,NULL ,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE) { printf("File could not be opened."); return FALSE; }
DWORD dwFileSize = GetFileSize(hFile,NULL); //CloseHandle(hFile); char *readBuf = new char[dwFileSize+1]; DWORD nRead = 0,nRet =0; while(nRead<dwFileSize){ if(ReadFile(hFile,readBuf+nRead,dwFileSize-nRead,&nRet,NULL) ==TRUE) { nRead+= nRet; } else { printf("Can read the file!"); CloseHandle(hFile); } }
PSTR pchAnsi = (PSTR)readBuf; pchAnsi[dwFileSize/sizeof(char)]=0; _strrev(pchAnsi);
pchAnsi = strchr(pchAnsi,'\n'); while(pchAnsi != NULL){ *pchAnsi++ ='\r'; *pchAnsi++ ='\n'; pchAnsi = strchr(pchAnsi,'\n'); } CloseHandle(hFile); DeleteFile(pszPathName);
HANDLE hWriteFile = CreateFile(pszPathName,GENERIC_WRITE|GENERIC_READ,0,NULL ,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(hWriteFile,readBuf,dwFileSize,&nRet,NULL); CloseHandle(hWriteFile);
delete readBuf;
return TRUE; } 我运行了几次,比较结果如下:
文件大小(byte) | 1方法时间(ms) | 2方法时间(ms) | 25416 | 0 | 0 | 101664 | 0 | 0 | 406656 | 0 | 10 | 1219968 | 10 | 30 | 3202416 | 21 | 100 | 9607248 | 80 | 551 | 67250736 | 581 | 5568 |
本人测试机器的CPU是迅池1.5的笔记本,内存为712MB
通过上面的测试我们可以看到使用内存映射文件的好处,在文件内存越大这种优势就体现的越明显,其中主要的原因是:
内存映射文件直接将文件的地址映射到进程的地址空间中,那么操作文件就相当于在内存中操作一样,省去了读和写I/O的时间;第二种方式是必须这么做(READFILE,WRITEFILE),这个过程是很慢的。
|