c++大文件读写操做(文件内存映射)

1、目的html

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

2、相关命令介绍windows

    一、  建立文件(CreateFile),以下:安全

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

 

 

参数解析:app

lpFileName:须要建立或者打开的文件名字函数

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

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

lpSecurityAttributes:文件的安全属性,一般为空设计

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

dwFlagsAndAttributes:文件属性和标志

hTemplateFile:模板文件句柄

    二、  建立文件内存映射(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
)

 

 参数解析:

lpSystemInfoSYSTEM_INFO结构指针

    四、  文件内存映射视图(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:文件视图指针

3、使用方法    

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

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

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

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

4、使用举例    

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

    代码工程名IOTest.sln

    详细代码见BigFileFun.hBigFileFun.cpp

    调用代码见IOTest.cpp_tmain函数

    详细代码(使用的vs2010)见以下连接:

    http://yunpan.cn/QDMzDE69qd3Pa 

    如需访问密码,请发邮箱mokimail126@126.com索取

参考文档:

http://blog.csdn.net/xmnathan/article/details/6072858

http://www.cnblogs.com/yukaizhao/archive/2011/05/18/MapViewOfFile_CreateFileMapping.html

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366548(v=vs.85).aspx

相关文章
相关标签/搜索