灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2585回复:0

win32下使用内存映射文件

楼主#
更多 发布于:2012-09-10 18:54

映射文件把虚拟可寻址空间映射到文件上。整个文件就可以很容易的访问,就像它在内存中一样。但是它实质还是在硬盘中,只是需要的时候载入需要的部分到内存,这样可以节约物理内存的使用。windows 使用 这个来加载EXE和DLL,所以这个因该是高效的。windows下默认的虚拟内存页最小是512KB,所以对512KB以下的文件使用就是多余的低效的。
按照以下步骤使用
1. 调用CreateFile打开您想要映射的文件。
2. 调用CreateFileMapping,其中要求传入先前CreateFile返回的句柄,该函数生成一个建立在CreateFile函数创建的文件对象基础上的内存映射对象。
3. 调用MapViewOfFile函数映射整个文件的一个区域或者整个文件到内存。该函数返回指向映射到内存的第一个字节的指针。
4. 用该指针来读写文件。
5. 调用UnmapViewOfFile来解除文件映射。
6. 调用CloseHandle来关闭内存映射文件。注意必须传入内存映射文件的句柄。
7. 调用CloseHandle来关闭文件。注意必须传入由CreateFile创建的文件的句柄。
/////////////////////////////////////////////
//为了简单 省略错误检查
//建一个test.txt的文本文件做实验
//这里只演示读取操作
//win32 console 程序
//winXP+vc6
//write by DKink|棼紫
//2007.10.09
#include "stdafx.h"
#include
#include
int main(int argc, char* argv[])
{
TCHAR *fileName =_T("test.txt");
//--------------------------------------
//打开文件
HANDLE fileHandle = CreateFile(
fileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,//文件必须存在
0,
NULL);
//--------------------------------------
//从文件创建映射对象
HANDLE fileMapping = CreateFileMapping(
fileHandle,
NULL,
PAGE_READONLY,
0,
0,
NULL);
//---------------------------------------
//把文件映射到指针(为什么用char,因为这个大小是一个Byte)
char *fileBase = (char *) MapViewOfFile(
fileMapping,
FILE_MAP_READ,
0,
0,
0);
//---------------------------------------
//使用数据
MessageBox(NULL,fileBase,"MTest",MB_OK);//这句可能有溢出,正常情况误用。
UnmapViewOfFile(fileBase);//解除文件映射
CloseHandle(fileMapping);//关闭内存映射文件
CloseHandle(fileHandle);//关闭文件
return 0;
}




喜欢0 评分0
游客

返回顶部