MFC创建内存映射文件二

知道了原理,现在开始编写具体的函数

1、首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件

2、通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。

3、通过MapViewOfFile()函数通过系统管理将文件映射对象的全部或部分映射到进程的地址空间。

4、操作文件Read/Write,对内存映射文件的使用和处理同通常加载到内存中的文件数据的处理方式基本一样。

5、在完成了对内存映射文件的使用后,还要通过一系列的操作完成对其的清除和使用过资源的释放。

下面的示例实现了创建内存映射文件,然后复制一份文件的功能

void CMFCApplication1Dlg::OnBnClickedOk()//点击OK
{

	CreateFileMappingEx();

}

void  CMFCApplication1Dlg::CreateFileMappingEx()//创建映射文件
{
	DWORD timebegin = ::timeGetTime();
	HANDLE fp = CreateFile(TEXT("E://Config.ini"),//这里输入复制的源文件 source
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_FLAG_SEQUENTIAL_SCAN,
		NULL);

	if (fp == NULL)
	{
		AfxMessageBox(_T("错误"), MB_OK, MB_ICONQUESTION);
		return;
	}

	DWORD dwBytesInBlock = GetFileSize(fp, NULL); //文件长度

	// 创建文件映射内核对象,句柄保存于hFileMapping
	HANDLE hFileMapping = CreateFileMapping(fp,
		NULL,
		PAGE_READWRITE,
		0,//(DWORD)(dwBytesInBlock >> 16),
		dwBytesInBlock,//(DWORD)(dwBytesInBlock & 0x0000FFFF),
		NULL);

	int dwError = GetLastError();

	// 释放文件内核对象
	CloseHandle(fp);

	// 偏移地址
	__int64 qwFileOffset = 0;

	// 将文件数据映射到进程的地址空间
	LPVOID pbFile = (LPVOID)MapViewOfFile(hFileMapping,
		FILE_MAP_ALL_ACCESS,
		(DWORD)(qwFileOffset >> 32),
		(DWORD)(qwFileOffset & 0xFFFFFFFF),
		dwBytesInBlock);

	HANDLE wp = CreateFile(TEXT("E://ggggg.ini"),//这里输入目标文件 destination
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_WRITE,
		NULL,
		CREATE_ALWAYS,
		FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_WRITE_THROUGH,
		NULL);

	HANDLE hFileMapping2 = CreateFileMapping(wp,
		NULL,
		PAGE_READWRITE,
		0,//(DWORD)(dwBytesInBlock >> 16),
		dwBytesInBlock,//(DWORD)(dwBytesInBlock & 0x0000FFFF),
		NULL);


	CloseHandle(wp);

	LPVOID pbFile2 = (LPVOID)MapViewOfFile(hFileMapping2,
		FILE_MAP_ALL_ACCESS,
		(DWORD)(qwFileOffset >> 32),
		(DWORD)(qwFileOffset & 0xFFFFFFFF),
		dwBytesInBlock);

	memcpy(pbFile2, pbFile, dwBytesInBlock);

	UnmapViewOfFile(pbFile2);
	UnmapViewOfFile(pbFile);

	CloseHandle(hFileMapping2);
	CloseHandle(hFileMapping);
	DWORD timeend = ::timeGetTime();
	CString str;

	str.Format(_T("%d"), timeend - timebegin);
	AfxMessageBox(str, MB_OK, MB_ICONQUESTION);

}

参考:

https://blog.csdn.net/xcw_1987/article/details/85857919

https://blog.csdn.net/educast/article/details/8477294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值