1. 文件映射 将文件映射到进程指定内存,对内存的操作,就是对文件的操作, 从而避免频繁的对文件进行读写的操作.并且操作效率比文件读写效率高很多,也能通过文件映射进行进程通信
文件映射步骤使用:
1创建有文件的文件映射 1. 打开文件 CreateFile 2. 创建文件映射对象 CreateFileMapping 3. 创建映射视图,把文件映射到内存 MapViewOfFile 系统内存分配粒度 -- 系统分配内存的最小单位 粒度 == 最小单位,可以通过 SYSTEM_INFO si; GetSystemInfo(&si);api获取
//打开文件 HANDLE hFileSrc = CreateFile( csSrcFilePath.GetBuffer(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFileSrc == INVALID_HANDLE_VALUE) { AfxMessageBox(_T("文件打开失败")); return; } //创建文件映射对象 HANDLE hFileMap = CreateFileMapping( hFileSrc, //文件句柄 NULL, PAGE_READWRITE, //文件权限:可读可写 0, // 最多映射大小:高位 0, // 最多映射大小:低位 //如果高位和低位都为0,最多将整个文件映射进内存 NULL);//共享名字,如果需要其他进程使用可以设置一个名字 if (hFileMap == NULL) { AfxMessageBox(_T("文件映射对象创建失败")); CloseHandle(hFileSrc); return; } //创建映射视图,把文件映射到内存 LPVOID pViewLast = MapViewOfFile( hFileMap, //映射对象句柄 FILE_MAP_WRITE, //可读可写 0, 0x10000, //从0x10000映射进内存(此值必须与系统内存分配粒度对齐,必须能整除分配粒度),否则会映射失败 0x1000); //映射的数据长度,映射0x1000大小 if (pViewLast == NULL) { AfxMessageBox(_T("最后一次创建映射失败")); CloseHandle(hFileMap); return; }清理: 1. 取消映射视图 2. 关闭映射对象 3. 关闭文件
UnmapViewOfFile(pViewLast); //取消映射视图 CloseHandle(hFileMap); //关闭映射对象 CloseHandle(hFileSrc); //关闭文件2创建没有文件的文件映射,实现进程中数据共享通信 第一个进程进行创建和映射
//创建映射对象 HANDLE hFileMap = CreateFileMapping( INVALID_HANDLE_VALUE, //标致宏,表示无文件名对象 NULL, PAGE_READWRITE, //可读可写 0, 0x1000, //调拨一个分页的物理内存使用 "MyFilemap");//没有名字 if (hFileMap == NULL) { AfxMessageBox(_T("文件映射对象创建失败")); return; } // 创建映射视图,把文件映射到内存 LPVOID m_pView = MapViewOfFile( hFileMap, FILE_MAP_WRITE, //可读可写 0, 0, //从首地址0开始映射 0x1000); //映射一个分页 if (m_pView == NULL) { AfxMessageBox(_T("文件映射失败")); CloseHandle(hFileMap); return; } }第二个进程通过打开文件映射对象然后进行映射来操作同一个文件映射对象来进行通信
//打开文件映射对象 HANDLE hMapFile = OpenFileMapping( FILE_MAP_WRITE, //访问权限,可读可写 FALSE, //不继承 "MyFilemap"); //文件映射对象名字 if (hMapFile == NULL) { AfxMessageBox(_T("文件映射对象打开失败")); return; } // 创建映射视图,把文件映射到内存 LPVOID pView = MapViewOfFile( hFileMap, FILE_MAP_WRITE, //可读可写 0, 0, //从首地址0开始映射 0x1000); //映射一个分页大小 if (m_pView == NULL) { AfxMessageBox(_T("文件映射失败")); CloseHandle(hFileMap); return; } }