内存映射文件三

步骤4从进程的地址空间中撤消文件数据的映像

当不再需要保留映射到进程地址空间区域中的文件数据时,可以通过调用下面的函数将它释放:

BOOL UnmapViewOfFile(PVOID pvBaseAddress);

参数:pvBaseAddressMapViewOfFile函数返回。

注意:如果没有调用这个函数,那么在进程终止运行前,保留的区域就不会被释放。每当调用MapViewOfFile时,系统总是在你的进程地址空间中保留一个新区域,而以前保留的所有区域将不被释放。

为了提高速度,系统将文件的数据页面进行高速缓存,并且在对文件的映射视图进行操作时立即更新文件的磁盘映像。如果需要确保你的更新被写入磁盘,可以强制系统将修改过的数据的一部分或全部重新写入磁盘映像中,方法是调用FlushViewOfFile函数:

BOOL FlushViewOfFile(

   PVOID pvAddress,

   SIZE_T dwNumberOfBytesToFlush);

第一个参数是包含在内存映射文件中的视图的一个字节的地址。该函数将你在这里传递的地址圆整为一个页面边界值。

第二个参数用于指明你想要刷新的字节数。系统将把这个数字向上圆整,使得字节总数是页面的整数。如果你调用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

// 创建者    :  方煜宽

// 邮箱      [email protected]

// 创建时间   :  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;

}

 

你可能感兴趣的:(职场,休闲,内存映射文件三)