在win32下使用内存映射文件

 在win32下使用内存映射文件

内存映射文件把虚拟可寻址空间映射到文件上。整个文件就可以很容易的访问,就像它在内存中一样。但是它实质还是在硬盘中,只是需要的时候载入需要的部分到内存,这样可以节约物理内存的使用。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 <tchar.h>
#include <windows.h>

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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值