MFC创建内存映射文件二

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-17 17:39:03

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

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"),//这里输入复制的源文件 sourcc
		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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!