Windows核心编程——内存映射

  Windows上,内存映射文件,使得大文件的读写不会消耗太多的内存,也减少了频繁的cpu指令。另外,windows上的进程间共享数据,也是通过内存映射文件的方式来实现。
刚好又遇到这个需求,需要在服务器上一次载入几十兆大小的文件,每个文件大约有100万条数据。所以温习一下这块内容。
使用内存映射文件,需要按下列操作步骤操作:
1,打开一个文件对象,也就是文件句柄了。
2,创建一个文件映射对象 。
3,获取文件映射对象在进程地址空间的指针。
当完成对内存映射文件操作时,执行下面这些步骤清理内存:
1,告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。
2,关闭文件映射对象。
3,关闭文件句柄。
内存映射可以高效的对大文件进行读写操作,可以这样理解,这个文件在物理磁盘上的存储空间被作为虚拟内存使用了,你读写这块内存区域,就相当于读写文件。在效率上,比I/O文件系统高了很多。win32上的进程间消息传递SendMessage和PostMessage都是用到这种方法。
实际上如果只是单纯使用它,就不必深究原理,否则需要去看《Windows核心编程》。
代码是硬道理:
假设在E盘有一个测试文件test.txt,内容如下:

执行以下代码:

#include "windows.h"

#include "stdio.h"


intmain()

{

//文件对象

TCHAR STR[] = "hello world!";

HANDLEhFile = CreateFile("E:\\test.txt",

GENERIC_READ | GENERIC_WRITE,

0,

NULL,

OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

NULL);

//映射对象

HANDLEhFileMapping = CreateFileMapping(hFile,

NULL,

PAGE_READWRITE,

0,

0,

NULL);

//这里赋值了2个文件映射的指针,地址从文件头开始

TCHAR*pbFile1 = (TCHAR*)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);

TCHAR*pbFile2 = (TCHAR*)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);

/*

输出字符串的内容,可以看到的是,把整个文件当作字符串输出了。

当然,如果文件中含有'\0'的字符,你看不到全部文件内容的输出。

*/

//两个输出的结果是一样的

printf("%s\n", pbFile1);

printf("%s\n", pbFile2);

/*

下面的操作是往这个pbFile1指向的地址写入点自定义的内容,

然后比较pbFile2指向地址的值是否相应改变了。

*/

memcpy(pbFile1, STR, strlen(STR));

printf("%s\n", pbFile1);

printf("%s\n", pbFile2);

//清理指针和内存

UnmapViewOfFile(pbFile1);

UnmapViewOfFile(pbFile2);

CloseHandle(hFileMapping);

CloseHandle(hFile);

return0;

}


 

 

看到的输出是这样的:

打开刚才那个test.txt,结果是这样的:

原理很复杂,用法很简单,over!

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值