赞
踩
内存映射文件主要用于以下三种情况:
系统使用内存映射文件,以便加载和执行. exe和DLL文件。这可以大大节省页文件空间和应用程序启动运行所需的时间。
可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。
可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据。Windows确实提供了其他一些方法,以便在进程之间进行数据通信,但是这些方法都是使用内存映射文件来实现的,这使得内存映射文件成为单个计算机上的多个进程互相进行通信的最有效的方法。
使用内存映射文件,需要执行下面三个步骤。
创建或打开一个文件内核对象,该对象标识了我们想要用作内存映射文件的那个磁盘文件。
创建一个文件映射内核对象,告诉系统该文件的大小和你打算如何访问该文件。
告诉系统把文件映射对象的部分或全部映射到进程的地址空间中。
当完成对内存映射文件的使用时,必须执行下面这些步骤将它清除:
步骤1:创建或打开文件内核对象
调用CreateFile来创建或打开一个文件内核对象。
- HANDLE CreateFile(
- PCSTR pszFileName,
- DWORD dwDesiredAccess,
- DWORD dwShareMode,
- PSECURITY_ATTRIBUTES psa,
- DWORD dwCreationDisposition,
- DWORD dwFlagsAndAttributes,
- HANDLE hTemplateFile
- );
步骤2:创建文件映射内核对象
调用CreateFileMapping函数告诉系统,文件映射内核对象需要多少物理存储器。
- HANDLE CreateFileMapping(
- HANDLE hFile,
- PSECURITY_ATTRIBUTES psa,
- DWORD fdwProtect,
- DWORD dwMaximumSizeHigh,
- DWORD dwMaximumSizeLow,
- PCTSTR pszName
- );
保护属性:
步骤3:将文件的数据映射到进程的地址空间
将文件的数据作为映射到该区域的物理存储器进行提交。
- PVOID MapViewOfFile(
- HANDLE hFileMappingObject,
- DWORD dwDesiredAccess,
- DWORD dwFileOffsetHigh,
- DWORD dwFileOffsetLow,
- SIZE_T dwNumberOfBytesToMap
- );
步骤4:从进程的地址空间中撤消文件数据的映像
BOOL UnmapViewOfFile(PVOID pvBaseAddress);
如果没有调用这个函数,那么在进程终止运行前,保留的区域就不会被释放。每当调用MapViewOfFile时,系统总是在你的进程地址空间中保留一个新区域,而以前保留的所有区域将不被释放。
为了提高速度,系统将文件数据的页面进行缓存处理,这样在处理文件映射视图的时候就不需要随时更新磁盘上的文件。如果需要确保你的更新被写入磁盘,可以强制系统将修改过的数据的一部分或全部重新写入磁盘映像中,方法是调用FlushViewOfFile函数:
- BOOL FlushViewOfFile(
- PVOID pvAddress,
- SIZE_T dwNumberOfBytesToFlush
- );
步骤5:关闭文件映射对象和文件对象
- HANDLE hFile = CreateFile(...);
-
- HANDLE hFileMapping = CreateFileMapping(hFile, ...);
-
- CloseHandle(hFile);
-
- PVOID pvFile = MapViewOfFile(hFileMapping, ...);
-
- CloseHandle(hFileMapping);
-
- // Use the memory-mapped file.
-
- UnmapViewOfFile(pvFile);
源码:
- #include <iostream>
- #include <windows.h>
- #include <iostream>
- using namespace std;
-
- int main()
- {
- // 自己创建一个test.txt文件,并写入内容
- HANDLE hFile = CreateFile(L"D:\\test.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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。