内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。
文件映射的优点
- 1.减少I/O操作
- 2.支持大文件
简单的文件映射读取文件例子
#include <windows.h>
#include <iostream>
int main() {
HANDLE hFile = ::CreateFile(L"1.txt",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
return 1;
do {
LARGE_INTEGER large_integer = { 0 };
if (!::GetFileSizeEx(hFile, &large_integer))
break;
size_t file_size = (size_t)large_integer.QuadPart;
HANDLE map_file = ::CreateFileMapping(hFile,
nullptr,
PAGE_READONLY,
0,
0,
nullptr);
if (map_file == nullptr)
break;
do {
LPVOID pMap = ::MapViewOfFile(map_file, FILE_MAP_READ, 0, 0, 0);
if (pMap == nullptr)
break;
char* buf = (char*)::malloc(file_size);
if (buf) {
memcpy(buf, pMap, file_size);
std::cout << buf << std::endl;
::free(buf);
}
::UnmapViewOfFile(pMap);
} while (0);
::CloseHandle(map_file);
} while (0);
::CloseHandle(hFile);
system("pause");
return 0;
}
作者:徐文焱