// 偏移量必须是分配粒度的倍数, 一般是 64k
SYSTEM_INFO lSystemInfo;
GetSystemInfo(&lSystemInfo);
//DWORD dwPageSize = lSystemInfo.dwPageSize;
DWORD dwPageSize = lSystemInfo.dwAllocationGranularity;
int ii = 0;
// 每段数据的开始位置,第一段是0,不记录
DWORD *dwFileOffset = new DWORDp[iAllNum];
for (ii = 0; ii < iAllNum; ++ii)
{
dwFileOffset[ii] = ((qwFileSize / iAllNum* (ii + 1)) + dwPageSize) / dwPageSize *dwPageSize;
}
dwFileOffset[iAllNum - 1] = qwFileSize;
// 测试映射本身消耗的时间
void CtestFuncDlg::OnBnClickedButton11()
{
CFileDialog flg(true);
if (flg.DoModal() == IDOK)
{
CTime cts = CTime::GetCurrentTime();
CString csPath = flg.GetPathName();
CString csMsg;
// 2、创建文件对象
HANDLE hFile = CreateFile(csPath, GENERIC_READ,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
csMsg.Format("创建文件对象失败,错误代码: 0x%x", GetLastError());
AfxMessageBox(csMsg);
return ;
}
// 3、得到文件尺寸
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
if (INFINITE == qwFileSize || 0 == qwFileSize)
{
CloseHandle(hFile);
csMsg.Format("创建文件映射对象失败,错误代码:0x%x", GetLastError());
AfxMessageBox(csMsg);
return ;
}
//4、 创建整个文件映射对象
HANDLE hSrcFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
for (int ii = 0; ii < 1; ++ii)
{
LPBYTE lpbSrcMapAddress = (LPBYTE)MapViewOfFile(hSrcFileMap, FILE_MAP_READ, 0, 0, qwFileSize);
UnmapViewOfFile(lpbSrcMapAddress);
lpbSrcMapAddress = NULL;
}
CloseHandle(hSrcFileMap);
hSrcFileMap = NULL;
CTimeSpan span = CTime::GetCurrentTime() - cts;
csMsg = _T("完成数据分割,消耗时间");
csMsg += span.Format(_T("%H:%M:%S"));
MessageBox(csMsg);
}
}