内存映射文件(Memory Mapping File)

感谢 

http://blog.csdn.net/sszgg2006/article/details/8573348
http://doudouclever.blog.163.com/blog/static/175112310201210210591835/

结果如上图所示:

stdafx.h:

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
vs10Console.cpp:

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <WinNT.h>
//#include <stdio.h>
//#include <windows.h>
#define BUFFSIZE 1024    //内存大小
#define FILE_MAP_START 0x28804  //文件映射的起始位置

LPTSTR lpcTheFile = TEXT("test.dat");
int main(void)
{
	HANDLE hMapFile;    //文件内存映射区域的句柄
	HANDLE hFile;     //文件的句柄
	DWORD dBytesWritten;   //写入的字节数
	DWORD dwFileSize;               //文件的大小
	DWORD dwFileMapSize;   //文件映射的大小
	DWORD dwMapViewSize;   //视图(View)的大小
	DWORD dwFileMapStart;   //文件映射视图的起始位置
	DWORD dwSysGran;    //系统内存分配粒度
	SYSTEM_INFO SysInfo;   //系统信息
	LPVOID lpMapAddress;   //内存映射区域的起始位置
	PCHAR pData;     //数据
	INT i;       //循环变量
	INT iData;      //
	INT iViewDelta;     //
	BYTE cMapBuffer[32];   //存储从mapping 中计出的数据
	//创建一个文件
	hFile = CreateFile(lpcTheFile, 
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	依次写入整数,一共写入65535个整数
	//for (i = 0; i < 65535; i++)
	//{
	//	WriteFile(hFile, &i, sizeof( i ), &dBytesWritten, NULL);
	//}
	//查看写入完成后的文件大小
	dwFileSize = GetFileSize(hFile, NULL);
	printf("文件大小:%d\n", dwFileSize);
	//获取系统信息,内存分配粒度
	//获取分配粒度,进行下面的几个计算
	//目的是为了映射的数据与系统内存分配粒度对齐,提高内存访问效率
	GetSystemInfo(&SysInfo);
	dwSysGran = SysInfo.dwAllocationGranularity; //内存分配粒度
	//计算mapping的起始位置
	dwFileMapStart = (FILE_MAP_START / dwSysGran ) * dwSysGran;
	//计算mapping view 的大小
	dwMapViewSize = (FILE_MAP_START % dwSysGran ) + BUFFSIZE;
	//计算mapping (文件映射)的大小
	dwFileMapSize = FILE_MAP_START + BUFFSIZE;
	//计算需要读取的数据的偏移
	iViewDelta = FILE_MAP_START - dwFileMapStart;
	//创建File mapping
	hMapFile = CreateFileMapping(hFile,   //需要映射的对象句柄
		NULL,         //安全选项,默认
		PAGE_READWRITE,       //可读、可写
		0,          //mapping 对象的大小,高位
		dwFileMapSize,       //mapping 对象的大小,低位
		NULL         //mapping对象的名字
		);
	cout<<"hFile="<<hFile<<endl;
	cout<<"hMapFile="<<hMapFile<<endl;
	//映射view
	lpMapAddress = MapViewOfFile(hMapFile,   //mapping 对象的句柄
		FILE_MAP_ALL_ACCESS,      // 可读可写
		0,           // 映射的文件偏移,高位
		dwFileMapStart,        //映射的文件偏移,低位
		dwMapViewSize);        //映射到View的数据大小
	if (lpMapAddress == NULL)
	{
		printf("MapViewOfFile error: %d\n",GetLastError());
		return 1;
	}
	printf("文件map view 相对于文件的起始位置:0x%x\n",dwFileMapStart);
	printf("文件map view的大小:0x%x\n", dwMapViewSize);
	printf("从相对map view 0x%x 字节的位置读取数据, ",iViewDelta);
	//将指向数据的指针偏移,到达我们关心的地方
	pData = (PCHAR) lpMapAddress + iViewDelta;
	//读取数据,赋值给变量
	iData = *(PINT)pData;
	//显示读取的数据
	printf("为:x%.8x\n", iData);
	//从mapping中复制数据,32个字节,并打印
	CopyMemory(cMapBuffer,lpMapAddress, 32);
	printf("lpMapAddress起始的字节是:");
	for (i = 0; i < 32; i++)
	{
		printf("0x%.2x ", cMapBuffer[i]);
	}
	//将mapping的前32个字节用xff填充
	FillMemory(lpMapAddress, 32, (BYTE)0Xff);
	//将映射的数据写回硬盘上
	FlushViewOfFile(lpMapAddress, dwMapViewSize);
	printf("\n已经将lpMapAddress开始的字节使用0xff填充。\n");
	//关闭mapping对象
	if (!CloseHandle(hMapFile))
	{
		printf("\nclosing the mapping object error %d!", GetLastError());
	}
	//关闭文件
	if (!CloseHandle(hFile))
	{
		printf("\nError %ld occured closing the file", GetLastError());
	}
	int ii;
	cin>>ii;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值