內存映射文件三

步驟4從進程的地址空間中撤消文件數據的映像ios

當再也不須要保留映射到進程地址空間區域中的文件數據時,能夠經過調用下面的函數將它釋放: windows

BOOL UnmapViewOfFile(PVOID pvBaseAddress);緩存

參數:pvBaseAddressMapViewOfFile函數返回。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);

 

例子:(vs2008代碼下載

// ------------------------------------------------------------

// 文件名    : 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;

}

相關文章
相關標籤/搜索