内存映射文件三
步驟4:從進(jìn)程的地址空間中撤消文件數(shù)據(jù)的映像
當(dāng)不再需要保留映射到進(jìn)程地址空間區(qū)域中的文件數(shù)據(jù)時(shí),可以通過調(diào)用下面的函數(shù)將它釋放:
BOOL UnmapViewOfFile(PVOID pvBaseAddress);
參數(shù):pvBaseAddress由MapViewOfFile函數(shù)返回。
注意:如果沒有調(diào)用這個(gè)函數(shù),那么在進(jìn)程終止運(yùn)行前,保留的區(qū)域就不會(huì)被釋放。每當(dāng)調(diào)用MapViewOfFile時(shí),系統(tǒng)總是在你的進(jìn)程地址空間中保留一個(gè)新區(qū)域,而以前保留的所有區(qū)域?qū)⒉槐会尫拧?/span>
為了提高速度,系統(tǒng)將文件的數(shù)據(jù)頁面進(jìn)行高速緩存,并且在對(duì)文件的映射視圖進(jìn)行操作時(shí)不立即更新文件的磁盤映像。如果需要確保你的更新被寫入磁盤,可以強(qiáng)制系統(tǒng)將修改過的數(shù)據(jù)的一部分或全部重新寫入磁盤映像中,方法是調(diào)用FlushViewOfFile函數(shù):
BOOL FlushViewOfFile(
?? PVOID pvAddress,
?? SIZE_T dwNumberOfBytesToFlush);
第一個(gè)參數(shù)是包含在內(nèi)存映射文件中的視圖的一個(gè)字節(jié)的地址。該函數(shù)將你在這里傳遞的地址圓整為一個(gè)頁面邊界值。
第二個(gè)參數(shù)用于指明你想要刷新的字節(jié)數(shù)。系統(tǒng)將把這個(gè)數(shù)字向上圓整,使得字節(jié)總數(shù)是頁面的整數(shù)。如果你調(diào)用FlushViewOfFile函數(shù)并且不修改任何數(shù)據(jù),那么該函數(shù)只是返回,而不將任何信息寫入磁盤。
?
步驟5和步驟6:關(guān)閉文件映射對(duì)象和文件對(duì)象
用CloseHandle函數(shù)關(guān)閉相應(yīng)的對(duì)象。
在代碼開始運(yùn)行時(shí)關(guān)閉這些對(duì)象:
HANDLE hFile = CreateFile(...);
HANDLE hFileMapping = CreateFileMapping(hFile, ...);
CloseHandle(hFile);
PVOID pvFile = MapViewOfFile(hFileMapping, ...);
CloseHandle(hFileMapping);
?
// Use the memory-mapped file.
?
UnmapViewOfFile(pvFile);
?
例子:(vs2008代碼下載)
// ------------------------------------------------------------
// 文件名??? : 17_FileMapping2.cpp
// 創(chuàng)建者?? ?:? 方煜寬
//?郵箱????? : fangyukuan@gmail.com
// 創(chuàng)建時(shí)間?? :? 2010-7-12 23:50
// 功能描述?? :? 內(nèi)存映射數(shù)據(jù)文件
//
// ------------------------------------------------------------
#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.
?? // 注意請(qǐng)?jiān)?/span>c盤,自己創(chuàng)建一個(gè)kuan.txt文件,并寫入內(nèi)容
?? 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;
}
?
轉(zhuǎn)載于:https://blog.51cto.com/rosehacker/449626
總結(jié)
- 上一篇: silverlight 客户端之间的通讯
- 下一篇: NHibernate VS .NET T