文件映射

1. 文件映射

内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行频繁读写操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

 

将文件映射到进程指定内存,对内存的操作,就是对文件的操作,

从而避免频繁的进行读写的操作.

 

 使用:

   1. 打开文件 CreateFile

   2. 创建文件映射对象 CreateFileMapping

 

HANDLE WINAPI CreateFileMapping(

_In_HANDLE hFile, //Long,指定欲在其中创建映射的一个文件句柄

_In_opt_LPSECURITY_ATTRIBUTES lpAttributes,

它指明返回的句柄是否可以被子进程所继承 .NULL表示使用默认安全对象。

_In_DWORD flProtect,      //打开方式  即权限

_In_DWORD dwMaximumSizeHigh,   //文件映射的最大长度的高32位。

_In_DWORD dwMaximumSizeLow, //文件映射的最大长度的低32位。

如果高位和低位全为0就将整个文件大小映射进内存

_In_opt_LPCTSTR lpName); //指定文件映射对象的名字。如存在这个名字的一个映射,函数就会打开它。用vbNullString可以创建一个无名的文件映射。

 

返回值 Long,新建文件映射对象的句柄

 

如果CreateFileMapping 最后一个参数写了可以通过

OpenFileMapping打开一个现成的文件映射对象。

HANDLE OpenFileMapping(

DWORD dwDesiredAccess, // access mode 访问权限,可读可写

BOOL bInheritHandle, // inherit flag 创建出来的子进程是否可以继承对象句柄

LPCTSTR lpName // object name);   指定要打开的文件映射对象名称。

 

2. 创建映射视图,把文件映射到内存  MapViewOfFile   

MapViewOfFile是计算机函数,功能是将一个文件映射对象映射到当前应用程序的地址空间MapViewOfFileEx允许我们指定一个基本地址来进行映射

相当于看报纸的放大镜  用来物理内存和内存的交互

LPVOID WINAPI MapViewOfFile(
  __in HANDLE hFileMappingObject, //CreateFileMapping()返回的文件映像对象句柄。
  __in DWORD dwDesiredAccess映射对象的文件数据的访问方式
  __in DWORD dwFileOffsetHigh, 表示文件映射起始偏移的高32位.
  __in DWORD dwFileOffsetLow, 表示文件映射起始偏移的低32位.
  __in SIZE_T dwNumberOfBytesToMap 指定映射文件的字节数.
  );

如果成功,则返回映射视图文件的开始地址值。

 

 系统内存分配粒度 -- 系统分配内存的最小单位

  粒度  == 最小单位

  //系统内存分配粒度

  SYSTEM_INFO si;

  GetSystemInfo(&si);

   

 清理:

   //1. 取消映射视图

  UnmapViewOfFile(pView);

  //2. 关闭映射对象

  CloseHandle(hFileMap);

  //3. 关闭文件

  CloseHandle(hFile);

 

posted @ 2020-09-04 14:08  特权E5  阅读(604)  评论(0编辑  收藏  举报