内存映射文件主要能解决两个问题:应用程序对大文件的高速访问和进程间的文件共享(作为一种通信方式)。
下面是摘自百度百科的解释:
内存映射文件,是由一个文件到一块内存的映射。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;
}