步骤4:从进程的地址空间中撤消文件数据的映像ios
当再也不须要保留映射到进程地址空间区域中的文件数据时,能够经过调用下面的函数将它释放: windows
BOOL UnmapViewOfFile(PVOID pvBaseAddress);缓存
参数:pvBaseAddress由MapViewOfFile函数返回。app
注意:若是没有调用这个函数,那么在进程终止运行前,保留的区域就不会被释放。每当调用MapViewOfFile时,系统老是在你的进程地址空间中保留一个新区域,而之前保留的全部区域将不被释放。ide
为了提升速度,系统将文件的数据页面进行高速缓存,而且在对文件的映射视图进行操做时不当即更新文件的磁盘映像。若是须要确保你的更新被写入磁盘,能够强制系统将修改过的数据的一部分或所有从新写入磁盘映像中,方法是调用FlushViewOfFile函数: 函数
BOOL FlushViewOfFile(spa
PVOID pvAddress,.net
SIZE_T dwNumberOfBytesToFlush);code
第一个参数是包含在内存映射文件中的视图的一个字节的地址。该函数将你在这里传递的地址圆整为一个页面边界值。orm
第二个参数用于指明你想要刷新的字节数。系统将把这个数字向上圆整,使得字节总数是页面的整数。若是你调用FlushViewOfFile函数而且不修改任何数据,那么该函数只是返回,而不将任何信息写入磁盘。
步骤5和步骤6:关闭文件映射对象和文件对象
用CloseHandle函数关闭相应的对象。
在代码开始运行时关闭这些对象:
HANDLE hFile = CreateFile(...);
HANDLE hFileMapping = CreateFileMapping(hFile, ...);
CloseHandle(hFile);
PVOID pvFile = MapViewOfFile(hFileMapping, ...);
CloseHandle(hFileMapping);
// Use the memory-mapped file.
UnmapViewOfFile(pvFile);
// ------------------------------------------------------------
// 文件名 : 17_FileMapping2.cpp
// 建立者 : 方煜宽
// 邮箱 : fangyukuan@gmail.com
// 建立时间 : 2010-7-12 23:50
// 功能描述 : 内存映射数据文件
//
// ------------------------------------------------------------
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// Open the file that we want to map.
// 注意请在c盘,本身建立一个kuan.txt文件,并写入内容
HANDLE hFile = ::CreateFile(L"C:\\kuan.txt",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
// Create a file-mapping object for the file.
HANDLE hFileMapping = ::CreateFileMapping(hFile,
NULL,
PAGE_WRITECOPY,
0, 0,
NULL);
PBYTE pbFile = (PBYTE)::MapViewOfFile(hFileMapping, FILE_MAP_COPY, 0, 0, 0);
cout << pbFile << endl;
::UnmapViewOfFile(pbFile);
::CloseHandle(hFileMapping);
::CloseHandle(hFile);
return 0;
}