内存映射文件

来源:互联网 发布:魔域副本源码 编辑:程序博客网 时间:2024/06/05 16:14

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

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

内存映射文件,是由一个文件到一块内存的映射。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;}


原创粉丝点击