CC++对大文件的快速读写(内存映射)
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:SYSTEM_INFO结构指针 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_ACCESS、FILE_MAP_COPY等 dwFileOffsetHigh:文件偏移大小高位 dwFileOffsetLow:文件偏移大小低位 注意:文件偏移必须是系统粒度的整数倍 dwNumberOfBytesToMap:映射多少数据进视图 5、 撤销文件内存映射视图(UnmapViewOfFile) BOOL WINAPI UnmapViewOfFile( _In_ LPCVOID lpBaseAddress ); 参数解析: lpBaseAddress:文件视图指针 三、使用方法 1、 使用CreateFile创建/打开一文件,这个文件对象标识了磁盘上将要用作内存映射文件的文件。 2、 使用CreateFileMapping函数来创建一个文件映射内核对象,告诉系统文件的尺寸以及访问文件的方式。 3、 使用MapViewOfFile函数负责通过系统的管理而将文件映射对象的全部或部分映射到进程地址空间。 4、 通过UnmapViewOfFile完成从进程的地址空间撤消文件数据的映像、通过CloseHandle关闭前面创建的文件映射对象和文件对象。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
copyright © 2008-2019 亿联网络 版权所有 备案号:粤ICP备14031511号-2