VC中用内存映射文件处理大文件---4G以上快的很

http://mh-nexus.de/en/downloads.php?product=HxD

hxd查看4G以上hex文件快的很




void CMapBigFIleDlg::OnOK() 
{
// TODO: Add extra validation here

//CDialog::OnOK();




/* CFileDialog fileDlg(TRUE, "*.txt", "*.txt", NULL, "文本文件 (*.txt)|*.txt||", this);
fileDlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
fileDlg.m_ofn.lpstrTitle = "通过内存映射文件读取数据";
if (fileDlg.DoModal() == IDOK)
{
*/ // 创建文件对象
   char *filepath =  "E:/Program Files/天狼星/屏幕录像专家 共享版 V7.5/ls/录像20.avi"  ;
HANDLE hFile = CreateFile(filepath, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //fileDlg.GetPathName()
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 = 1000 * dwGran;  //1000*64k=64M
if (qwFileSize < 1000 * dwGran)
{
  dwBlockBytes = (DWORD)qwFileSize;
}


int count=0;
char temp[20];


while (qwFileSize > 0)  //while (qwFileOffset > 0)
{


    
// 映射视图
  if (qwFileSize < 1000 * dwGran)  //last time 
{
  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);
// 撤消文件映像
*/




   if (qwFileSize < 1000 * dwGran)  //last time 
{
  //dwBlockBytes = (DWORD)qwFileSize;



memcpy(temp, lpbMapAddress+dwBlockBytes-21, sizeof(temp) );


}




UnmapViewOfFile(lpbMapAddress);
// 修正参数
qwFileOffset += dwBlockBytes;
qwFileSize -= dwBlockBytes;


count++;


TRACE("count:%d\n",count);



}
// 关闭文件映射对象句柄
TRACE("count:%d\n",count);


for(int i=0;i<20;i++)
{
TRACE("%02x ", (unsigned char)temp[i] );




}


CloseHandle(hFileMap);
AfxMessageBox("成功完成对文件的访问");
//}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值