用内存映射读取大文件
void CTestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 SYSTEM_INFO sinf; GetSystemInfo(&sinf); HANDLE hFile = CreateFile(TEXT("E:\\WIN7.GHO"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); DWORD dwFileSizeHigh; __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh); __int64 qwFileSizeT = qwFileSize; qwFileSize+=(((__int64)dwFileSizeHigh) << 32); CloseHandle(hFile); __int64 qwFileOffset = 0, qwNumOf0s = 0; while (qwFileSize > 0) { DWORD dwBytesInBlock = sinf.dwAllocationGranularity; if (qwFileSize< sinf.dwAllocationGranularity) dwBytesInBlock = (DWORD)qwFileSize; PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ, (DWORD) (qwFileOffset>>32), //starting bytes (high) (DWORD) (qwFileOffset&0xFFFFFFFF), //in file (low) dwBytesInBlock); //# of bytes to map for (DWORD dwByte=0; dwByte<dwBytesInBlock;dwByte++) { if (pbFile[dwByte]=='0') qwNumOf0s++; } UnmapViewOfFile(pbFile); qwFileOffset += dwBytesInBlock; qwFileSize -= dwBytesInBlock; CString str; str.Format(TEXT("已完成:%d%%"),100*(qwFileOffset&0xFFFFFFFF32)/(qwFileSizeT&0xFFFFFFFF32)); GetDlgItem(IDC_STATIC)->SetWindowText(str); } CloseHandle(hFileMapping); CString str; str.Format(TEXT("%d %d"), (DWORD)(qwNumOf0s>>32),(DWORD)(qwNumOf0s&0xFFFFFFFF) ); AfxMessageBox(str); }
posted on 2013-07-18 15:51 Sunny_NUAA 阅读(437) 评论(0) 收藏 举报