内存映射文件使用的步骤:
- 打开文件内核对象 CreateFile
- 创建文件映射内核对象 CreateFileMapping
- 将数据映射到地址空间 MapViewOfFile
- 撤销文件数据的映射 UnmapViewOfFile
- 关闭文件映射 CloseHandle
- 关闭文件对象 CloseHandle
文件内容倒序代码:
// 1. 打开文件内核对象
HANDLE hfile = CreateFile("F:\\MMFTEST.txt",GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hfile == INVALID_HANDLE_VALUE)
{
DWORD err = GetLastError();
cerr << _T("Open File Error: %d",err) << endl;
CloseHandle(hfile);
return 0 ;
}
DWORD dwFileSize = GetFileSize(hfile,NULL);
//2.创建文件映射内核对象
HANDLE hfilemap = CreateFileMapping(hfile,NULL,PAGE_READWRITE,0,dwFileSize+sizeof(WCHAR),NULL); //增加一个\0的长度
if (hfilemap == NULL)
{
DWORD err = GetLastError();
cerr << _T("Open File Map Error: %d",err) << endl;
CloseHandle(hfilemap);
CloseHandle(hfile);
return 0 ;
}
//3.将数据映射到地址空间
PVOID pbFile = MapViewOfFile(hfilemap,FILE_MAP_WRITE,0,0,0);
if (pbFile == NULL)
{
DWORD err = GetLastError();
cerr << _T("Map File Error: %d",err) << endl;
CloseHandle(hfilemap);
CloseHandle(hfile);
return 0 ;
}
//此处不考虑Unicode的情况
PSTR pch = (PSTR)pbFile;
//最后一位补0
pch[dwFileSize/sizeof(CHAR)] = 0;
_strrev(pch);
//修复\r\n的错误
pch = strchr(pch,'\n');
while(pch != NULL)
{
*pch++ = '\r';
*pch++ = '\n';
pch = strchr(pch,'\n');
}
//4.撤销文件数据的映射
UnmapViewOfFile(pbFile);
//5.关闭文件映射
CloseHandle(hfilemap);
//去掉补入的\0
SetFilePointer(hfile,dwFileSize,NULL,FILE_BEGIN);
SetEndOfFile(hfile);
//6.关闭文件对象
CloseHandle(hfile);
本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8163571