==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍


以下简介摘抄自搜狗百科:
文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的。

内存映射文件是由一个文件到进程地址空间的映射。Win32中,每个进程有自己的地址空间,一个进程不能轻易地访问另一个进程地址空间中的数据,所以不能像16位Windows那样做。Win32系统允许多个进程(运行在同一计算机上)使用内存映射文件来共享数据。实际上,其他共享和传送数据的技术,诸如使用SendMessage或者PostMessage,都在内部使用了内存映射文件。


利用内存映射文件来读写文件是大材小用了,这个速度当然是比一些I/O操作函数快了.

首先列出一些步骤和需要的函数

1.创建文件对象

//成功返回文件句柄,失败返回INVALID_HANDLE_VALUE
HANDLE CreateFile(LPCTSTR lpFileName,//创建或打开的文件名DWORD dwDesiredAccess,//想要对文件操作的方式DWORD dwShareMode,//指定共享的方式,也就是允许多进程同时对该文件操作LPSECURITY_ATTRIBUTES lpSecurityAttributes,//文件的安全属性,0表示默认DWORD dwCreationDisposition,//指定创建新的文件还是打开文件DWORD dwFlagsAndAttributes,//文件的标志和属性HANDLE hTemplateFile //用已经创建的文件对象做模板,可以覆盖该文件的属性);

2.创建文件映射对象

//成功返回文件映射句柄,失败返回NULL
HANDLE CreateFileMapping(HANDLE hFile,//文件句柄LPSECURITY_ATTRIBUTES lpFileMappingAttributes,//安全属性DWORD flProtect,//内存页的页面保护DWORD dwMaximumSizeHigh,//指定内存映射的大小DWORD dwMaximumSizeLow,LPCTSTR lpName //文件对象映射的名称,有了这个对象可以在多个进程之间//通过这个名字来数据交换);

3.将文件的数据映射到进程的地址空间

//成功返回映射的地址空间地址,失败返回NULL
LPVOID MapViewOfFile(HANDLE hFileMappingObject,//文件映射对象的句柄DWORD dwDesiredAccess,   //内存映射文件的访问权限DWORD dwFileOffsetHigh,  //指定文件从哪里开始映射,0,0表示从头开始DWORD dwFileOffsetLow,DWORD dwNumberOfBytesToMap//指定映射文件的大小,如果为0则表示把文件全部//内容映射到地址空间);

4.从进程的地址空间撤销对文件数据的映射

//成功返回非零,失败返回0
BOOL UnmapViewOfFile( LPCVOID lpBaseAddress );

5.关闭文件映射对象

  BOOL CloseHandle(hFileMapping)

6.关闭文件对象

BOOL CloseHandle(hFile)

这个例子的效果图:

代码如下:

//打开文件对话框CFileDialog dlg(TRUE, nullptr, nullptr, OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST,TEXT("文本文件(*.txt)|*.txt||"), this);if (dlg.DoModal()){//获取文件路径CString path = dlg.GetPathName();//创建文件对象HANDLE hFile = CreateFile(path,                     //文件路径     GENERIC_READ,             //只读操作FILE_SHARE_READ,          //只读共享nullptr,                  //默认安全属性OPEN_EXISTING,              //只能打开已经存在的文件,否则失败FILE_FLAG_SEQUENTIAL_SCAN,//对该文件进行顺序操作而不是随机操作nullptr                      //一般为0);if (hFile == INVALID_HANDLE_VALUE){AfxMessageBox(TEXT("创建对象失败!"));return;}//创建文件映射对象HANDLE hFileMapping = CreateFileMapping(hFile,         //文件对象句柄nullptr,     //默认安全属性PAGE_READONLY, //页面保护,只读0,              //需要内存大小和打开文件大小一样0,             //nullptr           //共享内存,这里不需要,设为null);if (!hFileMapping){AfxMessageBox(TEXT("创建文件映射对象失败!"));return;}//将文件映射到内存地址空间void* pBuffer = MapViewOfFile(hFileMapping,  //文件映射对象句柄 FILE_MAP_READ, //映射文件只读0,               //0表示从文件开头开始读取0,            //0             //0表示全部读取);if (!pBuffer){//出错就关闭句柄CloseHandle(hFileMapping);CloseHandle(hFile);return;}//把读取出来的数据转换后赋给m_content//要注意的是,必须先操作完 pBuffer才能UnmapViewOfFile,//如果先UnmapViewOfFile,再操作 pBuffer则会出错,因为pBuffer已经被释放了m_content = (LPCTSTR)pBuffer;UpdateData(FALSE);           //取消映射UnmapViewOfFile(pBuffer);//关闭文件映射对象CloseHandle(hFileMapping);//关闭文件对象CloseHandle(hFile);}

这个例子只能打开Unicode的文本,如果想打开ASCII的文本,则需要进行一些转换.方法如下:

        CStringA strA = (char*)basepointer;m_content = strA;

MFC-利用内存映射文件来读写文件相关推荐

  1. 文件内存映射mmap解决大文件快速读写问题和进程间共享内存

    mmap函数主要用途有三个: 1.将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能: 2.将特殊文件进行匿名内存映射,可以为关联进程提供共 ...

  2. c++ 利用内存映射读取大文件

    由于用到的txt存放的数据有几十万行,用getline来读取文件非常慢,搜索了一下可以来优化读取文件的方法. 据说用内存映射读取文件速度快,试了一下,但是发现要分行处理数据时,速度还是挺慢的. 有关内 ...

  3. MFC中如何以UNICODE编码格式读写文件

    在MFC中,有时候需要以特定编码格式(比如ANSI.UTF-8.UTF-16)保存文本文件.为了能够深入理解MFC读写文件的操作原理,先讲解BOM头和代码页的概念. 一 BOM(Byte order ...

  4. 【C 语言】文件操作 ( 按照内存块的方式读写文件 | fread 函数 | fwrite 函数 )

    文章目录 一.fwrite 函数 二.fread 函数 三.按照内存块的方式写文件 四.按照内存块的方式读文件 一.fwrite 函数 fwrite 函数 : 将 const void *ptr 指针 ...

  5. C++ CreateFileMapping 内存映射实现快速读取文件

    一.简述共享内存 共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法 ...

  6. python怎么写文件-Python 读写文件

    读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件 ...

  7. python导入csv文件-Python读写文件(csv、txt、excel)

    大家做在数据处理的时候,肯定难免会与文件交互,那么对于指定的文件类型,我们如何操作呢? 1.python读写csv文件 import csv #python2可以用file替代open with op ...

  8. python写文件读文件-Python 读写文件和file对象的方法(推荐)

    1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.tx ...

  9. python以读写方式打开文件_python读写文件操作详细介绍【传智播客】

    Python文件的打开或创建可以使用函数open().该函数可以指定处理模式,设置打开的文件为只读.只写或可读写状态.open()的声明如下所示. open(file, mode='r', buffe ...

  10. python怎么写文件-Python读写文件

    一.读写文件方式 在当前python文件同级目录下存在一个名为file的文件,内容如下 1.使用with open读取文件 defread_file(filepath): with open(file ...

最新文章

  1. 微信小程序下拉刷新和上拉加载
  2. TCGAbiolinks包分析TCGA数据
  3. jaccard相似度_Jaccard与cosine文本相似度的异同
  4. jQuery中hover与mouseover和mouseout的区别分析
  5. Android6.0的Looper源码分析(1)
  6. mysql加入用户_Mysql 添加用户
  7. 每日一天:对象数组去重
  8. 我的2017年前端之路总结
  9. nginx php exec,PHP Web 端如何操作 Nginx 配置
  10. vc6配置c语言编译环境,驱动WDK7600在VC6.0下的编译开发配置环境
  11. apache连接mysql配置_Apache+PHP配置及连接mysql数据库
  12. PMP®|项目经理如何应对项目需求变更?
  13. SC16IS750在STM32的应用
  14. php js 美国时间转换,洛杉矶时间换算(世界时间换算器在线)
  15. COGS.1689.[HNOI2010]Bounce 弹飞绵羊(分块)
  16. 计算机音乐出山,《出山》音乐
  17. 开发人员的不断流动、让我们更加坚定信念,一定要控制好整个系统的底层架构、核心设计、日常质量检查工作
  18. win10怎么打开网络计算机,Win10怎么启用网络发现?
  19. 到底什么是阿里味?能否在不加入阿里的时候可以体验一下
  20. 课题组王猛的论文被遥感领域顶级期刊 IEEE TGRS 录用

热门文章

  1. Adams安装出错的一种情况
  2. Diamond软件的使用(5)--建立Modelsim仿真环境
  3. 【图像分割】基于马尔可夫随机场实现图像分割附matlab代码
  4. 广西南宁机器人比赛_广西南宁中小学生机器人竞赛精彩纷呈
  5. 如何用谷歌地图下载器下载大字体谷歌地图打印喷绘
  6. 关于HTML转word小记
  7. 技能大赛训练题:交换机虚拟化练习
  8. 自然语言处理十大应用
  9. 计算机联锁系统组成及工作原理,计算机联锁系统的组成
  10. 13-24.产品经理入门到精通(二)