步驟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;
}