博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++大文件读写操作(文件内存映射)
阅读量:7108 次
发布时间:2019-06-28

本文共 2279 字,大约阅读时间需要 7 分钟。

hot3.png

一、目的

    用传统的IO读写大文件,所花时间很长,这往往是程序设计时的瓶颈。使用文件内存映射的方法,将数据分块读入内存,再进行处理。这可以很高效的解决c++读写大文件的问题。

二、相关命令介绍

    1、  创建文件(CreateFile),如下:

HANDLE CreateFile(   LPCTSTR lpFileName,   DWORD dwDesiredAccess,   DWORD dwShareMode,   LPSECURITY_ATTRIBUTES lpSecurityAttributes,   DWORD dwCreationDisposition,   DWORD dwFlagsAndAttributes,   HANDLE hTemplateFile);

 

 

参数解析:

lpFileName:需要创建或者打开的文件名字

dwDesiredAccess:文件的打开方式,GENERIC_READ(只读), GENERIC_WRITE(只写), GENERIC_READ | GENERIC_WRITE(读写)

dwShareMode:文件的共享方式,如:FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE

lpSecurityAttributes:文件的安全属性,通常为空

dwCreationDisposition:文件的访问方式,如:CREATE_ALWAYS, CREATE_NEW, OPEN_ALWAYS, OPEN_EXISTING, or TRUNCATE_EXISTING(只能是其中一种,不能组合使用)

dwFlagsAndAttributes:文件属性和标志

hTemplateFile:模板文件句柄

    2、  创建文件内存映射(CreateFileMapping),如下:

HANDLE WINAPI CreateFileMapping(  _In_      HANDLE hFile,  _In_opt_  LPSECURITY_ATTRIBUTES lpAttributes,  _In_      DWORD flProtect,  _In_      DWORD dwMaximumSizeHigh,  _In_      DWORD dwMaximumSizeLow,  _In_opt_  LPCTSTR lpName);

 

 参数解析:   

hFile:需要创建文件内存映射的文件句柄

lpAttributes:安全属性指针

flProtect:文件内存映射访问模式

dwMaximumSizeHigh:内存映射大小的高32

dwMaximumSizeLow:内存映射大小的低32

lpName:内存映射的名字

    3  获得系统分配粒度(GetSystemInfo),如下:

void WINAPI GetSystemInfo(  _Out_  LPSYSTEM_INFO lpSystemInfo)

 

 参数解析:

lpSystemInfo结构指针

    4、  文件内存映射视图(MapViewOfFile)

LPVOID WINAPI MapViewOfFile(  _In_  HANDLE hFileMappingObject,  _In_  DWORD dwDesiredAccess,  _In_  DWORD dwFileOffsetHigh,  _In_  DWORD dwFileOffsetLow,  _In_  SIZE_T dwNumberOfBytesToMap);

 

  参数解析:

hFileMappingObject:文件内存映射句柄

dwDesiredAccess:访问方式,如FILE_MAP_ALL_ACCESSFILE_MAP_COPY

dwFileOffsetHigh:文件偏移大小高位

dwFileOffsetLow:文件偏移大小低位

注意:文件偏移必须是系统粒度的整数倍

dwNumberOfBytesToMap:映射多少数据进视图

    5  撤销文件内存映射视图(UnmapViewOfFile)

BOOL WINAPI UnmapViewOfFile(  _In_  LPCVOID lpBaseAddress);

 

 参数解析:

lpBaseAddress:文件视图指针

三、使用方法    

    1、  使用CreateFile创建/打开一文件,这个文件对象标识了磁盘上将要用作内存映射文件的文件。

    2、  使用CreateFileMapping函数来创建一个文件映射内核对象,告诉系统文件的尺寸以及访问文件的方式。

    3、  使用MapViewOfFile函数负责通过系统的管理而将文件映射对象的全部或部分映射到进程地址空间。

    4、  通过UnmapViewOfFile完成从进程的地址空间撤消文件数据的映像、通过CloseHandle关闭前面创建的文件映射对象和文件对象。

四、使用举例    

    功能:在一个大文件(文件名BigFile.txt)中,查找一字符串”End”。实现根据字符串"End"将文件截断的功能。

    代码工程名IOTest.sln

    详细代码见BigFileFun.hBigFileFun.cpp

    调用代码见IOTest.cpp_tmain函数

    详细代码(使用的vs2010)见如下链接:

     

    如需访问密码,请发邮箱索取

参考文档:

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/1426828/blog/187033

你可能感兴趣的文章
mvc.net分页查询案例——PagerExtension
查看>>
浅谈C#网络编程(一)
查看>>
[转载]Nginx 常见应用技术指南
查看>>
如何使用sqlserver 2012 空间查询(geometry及 geography)
查看>>
样式的继承:
查看>>
UI设计要学哪些软件
查看>>
【分享】GEARS of DRAGOON 1+2【日文硬盘版】[带全CG存档&攻略+SSG改动+打开存档补丁]...
查看>>
cocos2d-x中的坐标系
查看>>
第十周作业
查看>>
XML Linq 学习笔记
查看>>
Ext4文件系统架构分析(三)
查看>>
关于dva的一些认识
查看>>
OpenJ_Bailian 2815 城堡问题(DFS)
查看>>
Silverlight使用WCF操纵数据库(SQL Server)指南
查看>>
Scout YYF I POJ - 3744(矩阵优化)
查看>>
表格资料
查看>>
四则运算2
查看>>
数据结构实验之排序一:一趟快排
查看>>
Js计算-当月每周有多少天
查看>>
Kernel 源代码 小记
查看>>