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)建文件內(nèi)核對象,其句柄保存于hFile HANDLE hFile = CreateFile("Recv1.zip", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL); // 創(chuàng)建文件映射內(nèi)核對象,句柄保存于hFileMapping HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE, 0, 0x4000000, NULL); // 釋放文件內(nèi)核對象 CloseHandle(hFile); // 設(shè)定大小、偏移量等參數(shù) __int64 qwFileSize = 0x4000000; __int64 qwFileOffset = 0; __int64 T = 600 * sinf.dwAllocationGranularity; DWORD dwBytesInBlock = 1000 * sinf.dwAllocationGranularity; // 將文件數(shù)據(jù)映射到進(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) { // 接收數(shù)據(jù)事件觸發(fā) case 0: // 從端口接收數(shù)據(jù)并保存到內(nèi)存映射文件 nReadLen=syio_Read(port[1], pbFile + qwFileOffset, QueueLen); qwFileOffset += nReadLen; // 當(dāng)數(shù)據(jù)寫滿60%時,為防數(shù)據(jù)溢出,需要在其后開辟一新的映射視圖 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)程的地址空間撤消文件數(shù)據(jù)映像 UnmapViewOfFile(pbFile); // 關(guān)閉文件映射對象 CloseHandle(hFileMapping); break; } } … |
// 創(chuàng)建另外一個文件內(nèi)核對象 hFile2 = CreateFile("Recv.zip", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL); // 以實(shí)際數(shù)據(jù)長度創(chuàng)建另外一個文件映射內(nèi)核對象 hFileMapping2 = CreateFileMapping(hFile2, NULL, PAGE_READWRITE, 0, (DWORD)(qwFileOffset&0xFFFFFFFF), NULL); // 關(guān)閉文件內(nèi)核對象 CloseHandle(hFile2); // 將文件數(shù)據(jù)映射到進(jìn)程的地址空間 pbFile2 = (PBYTE)MapViewOfFile(hFileMapping2, FILE_MAP_ALL_ACCESS, 0, 0, qwFileOffset); // 將數(shù)據(jù)從原來的內(nèi)存映射文件復(fù)制到此內(nèi)存映射文件 memcpy(pbFile2, pbFile, qwFileOffset); file://從進(jìn)程的地址空間撤消文件數(shù)據(jù)映像 UnmapViewOfFile(pbFile); UnmapViewOfFile(pbFile2); // 關(guān)閉文件映射對象 CloseHandle(hFileMapping); CloseHandle(hFileMapping2); // 刪除臨時文件 DeleteFile("Recv1.zip"); |