您的位置:首页 > 其它

用内存映射读取大文件

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: