用内存映射读取大文件

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)    收藏  举报

导航