内存映射文件在读写文件方面提供了一种完全不同的方法。采用标准文件IO函数将文件以流的形式读入。要访问一个文件不同部分的字节数据,必须将文件指针移至第一个字节处,读入数据,移动文件指针,再读入数据。
当你对内存映射文件进行读写操作时,这些改动将会反映在你从同一缓冲区中所读回的数据上。当你关闭了内存映射文件时,系统将改动过的数据写回到原始文件中。如果你想让数据在关闭文件前就歇会文件的话,可以使用下面的函数:FlushViewofFile()。
当你不再使用内存映射文件时,必须做一点清理工作。首先必须调用UnmapViewOfFile来解除视图与文件映射对象的关系。其次,必须调用函数来关闭映射对象以及文件本身,两者的关闭都是通过调用CloseHandle来完成的。首先是关闭内存映射对象,然后再关闭文件。
下面的代码演示了完整的打开文件、创建映射对象和映射视图,以及清理工作的全过程。
WinCE6以及以后的版本中,要以内存映射的访问方式打开一个文件,必须先调用CreateFile来打开它,就像标准的流访问方式一样。在WinCE5.0以及以前的版本中,必须用WinCE中独特的CreateFileForMapping()来打开文件。
HANDLE hFile,hFileMap;
PBYTE pFileMem;
TCHAR szFileName[MAX_PATH];
hFile = CreateFile(szFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,0);
if(hFile!=INVALID_HANDLE_VALUE)
{
pFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,0);
if(hFileMap)
{
pFileMem = (PBYTE)MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);
if(pFileMem)
{
// use data of the file
//Start cleanup by unmapping view.
UnmapViewOfFile(pFileMem);
}
CloseHandle(hFileMap);
}
CloseHandle(hFile);
}