c++使用文件映射的方式读取文件

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