文件映射
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);