C\C++對大檔案的快速讀寫(記憶體對映)
阿新 • • 發佈:2019-01-22
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關閉前面建立的檔案對映物件和檔案物件。
四、示例程式碼如下: #include <stdio.h> #include <iostream> #include <string> using namespace std; int main() { HANDLE fh; HANDLE MapFileH; HANDLE OpenMap; HANDLE MapHandle; fh=CreateFile("C:\cpp_1000000.txt ", GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); if(fh == INVALID_HANDLE_VALUE) { cout<< "Error in CreateFile ! " <<endl; return FALSE; } MapFileH=CreateFileMapping( fh,NULL,PAGE_READWRITE,0,0,"Resource " ); if(MapFileH == NULL) { cout << "Error in CreateFileMapping! " <<endl; } OpenMap=OpenFileMapping(FILE_MAP_ALL_ACCESS,true, "Resource " ); if(OpenMap == NULL) { cout<< "Error in OpenFileMapping! " <<endl; } MapHandle=MapViewOfFile( OpenMap, FILE_MAP_ALL_ACCESS, 0, 0, 0 ); if(MapHandle == NULL) { cout << "Error in MapViewOfFile! " <<endl; } // 對資料進行處理。 UnmapViewOfFile(MapHandle); CloseHandle(OpenMap); CloseHandle(fh); return 0;
}
參考:
http://www.xuebuyuan.com/936359.html
http://www.360doc.com/content/14/1023/08/16342614_419121605.shtml