用内存映射读取大文件
2013-07-18 15:51
211 查看
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); }
相关文章推荐
- 用C语言读取大文件的问题 内存映射
- 内存映射方式读取文件
- 内存映射文件中读取数据
- c# 内存共享、内存映射文件、适合读取大文件
- 用C语言读取大文件的问题 内存映射
- 使用内存映射文件加快读取大文件的速度 .
- 如何创建内存映射文件,并对其进行写入与读取数据
- 内存映射文件-java读取超大文件
- 用C语言读取大文件的问题--内存映射
- 【转】C#大文件读取和查询--内存映射
- 67.文件映射为内存进行操作与多线程 以及 文件映射到内存根据索引进行内存来实现读取多线程操作
- 用C语言读取大文件的问题 内存映射
- 用C语言读取大文件的问题 内存映射
- iOS将大文件映射到内存(读取大文件)
- 用C语言读取大文件的问题 内存映射
- C#大文件读取和查询--内存映射
- 用C语言读取大文件的问题 内存映射
- 用C语言读取大文件的问题 内存映射
- iOS将大文件映射到内存(读取大文件)
- c语言实现mmap内存映射读取文件和文件加密