19,468
社区成员
发帖
与我相关
我的任务
分享
void CRiftGameProDlg::TestCfile()
{
//
CFileDialog fileDlg(TRUE,_T("*.txt"),_T("*.txt"),NULL,_T("文本文件(*.txt)|*.txt||"),this);
//fileDlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
//fileDlg.m_ofn.lpstrFileTitle = _T("通过内存映射文件读取数据");
if (fileDlg.DoModal() == IDOK)
{
//创建文件对象
HANDLE hFile = CreateFile(fileDlg.GetPathName(),GENERIC_READ|GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
TRACE ("创建文件对象失败,错误代码:%d\r\n",GetLastError());
return;
}
//创建文件映射对象
HANDLE hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
if (hFileMap == NULL)
{
TRACE("创建文件映射对象失败,错误代码:%d\r\n",GetLastError());
return;
}
//得到系统分配颗粒
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;
//得到文件尺寸
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile,&dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh)<<32);
//关闭文件对象
CloseHandle(hFile);
//偏移地址
__int64 qwFileOffset = 0;
//块大小
DWORD dwBlockBytes = dwGran;
while (qwFileSize >0)
{
//映射视图
if (qwFileSize<dwGran)
dwBlockBytes = (DWORD)(qwFileSize);
LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
if (lpbMapAddress == NULL)
{
TRACE("映射文件映射失败,错误代码:%d\r\n",GetLastError());
return;
}
//对映射的视图碱性访问
for (DWORD i = 0; i<dwBlockBytes;i++)
{
BYTE temp = *(lpbMapAddress+i);
}
//撤销文件映射
UnmapViewOfFile(lpbMapAddress);
//修正参数
qwFileOffset += dwBlockBytes;
qwFileSize -= dwBlockBytes;
}
//关闭文件映射对象句柄
CloseHandle(hFileMap);
AfxMessageBox(_T("成功完成对文件的访问"));
}
}