内存映射文件

内存映射文件主要能解决两个问题:应用程序对大文件的高速访问和进程间的文件共享(作为一种通信方式)。

下面是摘自百度百科的解释:

内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

记录一下使用内存映射文件实现对磁盘文件的读写:

// FileCopy.cpp : 定义控制台应用程序的入口点。
//

#include<stdio.h> 
#include<windows.h>
#include<winioctl.h>
#include<tchar.h>
#include<Shlwapi.h>
#include<math.h>
#include<time.h>
#include<string>
using namespace std;

//#pragma comment(lib,"Shlwapi.lib")
//#pragma comment(lib,"Kernel32.lib")

bool createFileWithSize(TCHAR* filename, LARGE_INTEGER filesize, bool initwithchar) {
	HANDLE hFile = INVALID_HANDLE_VALUE;
	HANDLE hFileMap = NULL;
	LARGE_INTEGER realSize;
	filesize.QuadPart = filesize.QuadPart * 1024 * 1024;
	//得到文件句柄
	hFile = CreateFile(filename, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);
	if (INVALID_HANDLE_VALUE == hFile) {
		printf("CreateFile Error : %d\n", GetLastError());
		CloseHandle(hFile);
		return FALSE;
	}
	//创建文件内存映射
	hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, filesize.HighPart, filesize.LowPart, NULL);
	if (NULL == hFileMap) {
		printf("CreateFileMapping Error : %d\n", GetLastError());
		CloseHandle(hFile);
		CloseHandle(hFileMap);
		return FALSE;
	}
	if (initwithchar) {
		//将文件映射对象映射到当前应用程序的地址空间,获取文件内存映射指针
		char* lpMapAddr = (char*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
		ULONGLONG tempSize = filesize.QuadPart;
		if (!GetFileSizeEx(hFile, &realSize)) { printf("Get File Size error\n"); }
		else { printf("realSize is : %lldByte\n", realSize.QuadPart); tempSize = realSize.QuadPart; }
		srand((UINT)time(NULL));
		char *buf = (char*)malloc(sizeof(char) * 10);
		UINT blockSize = sizeof(char) * 10;
		for (; tempSize > 1; tempSize-=blockSize) {
			itoa(rand(), buf, 10);
			blockSize = tempSize < sizeof(char)*strlen(buf) ? tempSize : sizeof(char)*strlen(buf);
			memcpy(lpMapAddr, buf, blockSize);
			lpMapAddr += blockSize;
		}
		printf("initFile Success\n");
		UnmapViewOfFile(hFileMap);
	}
	printf("createFileWithSize Success\n");
	CloseHandle(hFileMap);
	CloseHandle(hFile);
	return TRUE;
}
int   main(int   argc, char   *argv[]) {
	LARGE_INTEGER size;
	size.QuadPart = 50;
	wchar_t filename[] = L"F://rsfile.txt";
	createFileWithSize(filename, size, TRUE);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值