
| HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); |
| HANDLE CreateFileMapping(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName); |
| LPVOID MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap); |
| SYSTEM_INFO sinf; GetSystemInfo(&sinf); DWORD dwAllocationGranularity = sinf.dwAllocationGranularity; |
| BOOL UnmapViewOfFile(LPCVOID lpBaseAddress); |
| …… // 創(chuàng )建文件內核對象,其句柄保存于hFile HANDLE hFile = CreateFile("Recv1.zip", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL); // 創(chuàng )建文件映射內核對象,句柄保存于hFileMapping HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE, 0, 0x4000000, NULL); // 釋放文件內核對象 CloseHandle(hFile); // 設定大小、偏移量等參數 __int64 qwFileSize = 0x4000000; __int64 qwFileOffset = 0; __int64 T = 600 * sinf.dwAllocationGranularity; DWORD dwBytesInBlock = 1000 * sinf.dwAllocationGranularity; // 將文件數據映射到進(jìn)程的地址空間 PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, (DWORD)(qwFileOffset>>32), (DWORD)(qwFileOffset&0xFFFFFFFF), dwBytesInBlock); while(bLoop) { // 捕獲事件hEvent[0]和事件hEvent[1] DWORD ret = WaitForMultipleObjects(2, hEvent, FALSE, INFINITE); ret -= WAIT_OBJECT_0; switch (ret) { // 接收數據事件觸發(fā) case 0: // 從端口接收數據并保存到內存映射文件 nReadLen=syio_Read(port[1], pbFile + qwFileOffset, QueueLen); qwFileOffset += nReadLen; // 當數據寫(xiě)滿(mǎn)60%時(shí),為防數據溢出,需要在其后開(kāi)辟一新的映射視圖 if (qwFileOffset > T) { T = qwFileOffset + 600 * sinf.dwAllocationGranularity; UnmapViewOfFile(pbFile); pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, (DWORD)(qwFileOffset>>32), (DWORD)(qwFileOffset&0xFFFFFFFF), dwBytesInBlock); } break; // 終止事件觸發(fā) case 1: bLoop = FALSE; // 從進(jìn)程的地址空間撤消文件數據映像 UnmapViewOfFile(pbFile); // 關(guān)閉文件映射對象 CloseHandle(hFileMapping); break; } } … |
| // 創(chuàng )建另外一個(gè)文件內核對象 hFile2 = CreateFile("Recv.zip", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL); // 以實(shí)際數據長(cháng)度創(chuàng )建另外一個(gè)文件映射內核對象 hFileMapping2 = CreateFileMapping(hFile2, NULL, PAGE_READWRITE, 0, (DWORD)(qwFileOffset&0xFFFFFFFF), NULL); // 關(guān)閉文件內核對象 CloseHandle(hFile2); // 將文件數據映射到進(jìn)程的地址空間 pbFile2 = (PBYTE)MapViewOfFile(hFileMapping2, FILE_MAP_ALL_ACCESS, 0, 0, qwFileOffset); // 將數據從原來(lái)的內存映射文件復制到此內存映射文件 memcpy(pbFile2, pbFile, qwFileOffset); file://從進(jìn)程的地址空間撤消文件數據映像 UnmapViewOfFile(pbFile); UnmapViewOfFile(pbFile2); // 關(guān)閉文件映射對象 CloseHandle(hFileMapping); CloseHandle(hFileMapping2); // 刪除臨時(shí)文件 DeleteFile("Recv1.zip"); |
聯(lián)系客服