Windows核心编程——进程间通信之文件内存映射

文件内存映射

1.什么是文件内存映射

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

 

  文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的

2.Windows提高的文件内存映射的API

  包括:打开文件、读、写、关闭、文件指针。都在File I/O Functions下,可以通过MSDN查看

 

 

 

3.代码示例

 

使用内存映射:createFile->readFile-> WriteFile->close

HANDLE hFile = CreateFile(
			"ReadMe.txt",
			GENERIC_READ | GENERIC_WRITE, //对文件进行读写操作
			FILE_SHARE_READ, //允许其他人对此文件进行读操作
			NULL,
			OPEN_EXISTING, //打开已经存在的文件,如果文件不存在,则函数失败
			FILE_ATTRIBUTE_NORMAL, //没有别的需求,就填这个宏值
			NULL
		);
	
		if (hFile == INVALID_HANDLE_VALUE)
		{
			printf("文件打开失败");
			return 0;
		}
		//读取
		char aryBuff[MAXWORD] = { 0 };
		BOOL bRet = ReadFile(hFile, aryBuff, sizeof(aryBuff), NULL, NULL);
	
	
		if (!bRet)
		{
			printf("文件读取失败!!!!");
		}
		//写入
		char aryBuffToWrite[] = { "hello hello hello!!!!"};
		bRet = WriteFile(hFile, aryBuffToWrite, sizeof(aryBuffToWrite), NULL,           NULL);
		if (!bRet)
		{
			printf("写入失败.");
		}
	
		//关闭文件
		CloseHandle(hFile);
    

 

可以看出内存的变化:

读取

 

写入

 

 

 

 PS:像其他操作文件的api底层基本上都是以这些封装的这些api为基础

 

posted @ 2020-05-29 00:55  Wings_shadow  阅读(392)  评论(0编辑  收藏  举报