内存映射文件三

步骤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;

}

相关文章
相关标签/搜索