异常的内存映射文件
错误的内存映射文件
qwFileSize = 58984823
nMapCount==9
的时候,无缘故的在while循环里直接return了.错误码为5.
我已经用这条语句来控制了,防止多映射数据,导致映射错误
if(qwFileSize-qwFileOffset<T_newmap)
break;
结果依然报错。
郁闷,算法不对么?
------解决方案--------------------
改为
(DWORD)(qwFileOffset>>32)
------解决方案--------------------
感觉可能会有问题,一次映射100*64KB,映射次数多了有可能会失败,进程总共4GB地址空间,可用的不过2G左右,并不能每次都能找到一块连续的这么大的空间,以前就碰到过这种问题,最后只好改成64KB(内存分配粒度大小),有说错的情楼下指正
qwFileSize = 58984823
nMapCount==9
的时候,无缘故的在while循环里直接return了.错误码为5.
我已经用这条语句来控制了,防止多映射数据,导致映射错误
if(qwFileSize-qwFileOffset<T_newmap)
break;
结果依然报错。
郁闷,算法不对么?
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR strFile[MAX_PATH]=_T("F:\\soft\\AdbeRdr1010_zh_CN.zip");
// 创建文件对象
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ,FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("创建文件对象失败,错误代码:%d\r\n", GetLastError());
return 0;
}
// 创建文件映射对象
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hFileMap == NULL)
{
printf("创建文件映射对象失败,错误代码:%d\r\n", GetLastError());
return 0;
}
// 得到系统分配粒度
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;
// 得到文件尺寸
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32);///MSDN
char *lpbMapAddress=NULL;
__int64 qwFileOffset = 0; //起始地址
__int64 T_newmap = 100*dwGran; //100*64KB
int nMapCount=qwFileSize/T_newmap;
while(nMapCount)
{
lpbMapAddress=(char*)MapViewOfFile(hFileMap,FILE_MAP_READ,(DWORD)qwFileOffset>>32,(DWORD)qwFileOffset,T_newmap);
if(lpbMapAddress==NULL)
{
printf("MapViewOfFile失败,错误码为:%d\r\n",GetLastError());
return 0;
}
{
/*do something....*/
}
UnmapViewOfFile(lpbMapAddress);
if(qwFileSize-qwFileOffset<T_newmap)
break;
qwFileOffset+=T_newmap;
nMapCount--;
}
//剩余的映射
lpbMapAddress=(char*)MapViewOfFile(hFileMap,FILE_MAP_READ,(DWORD)qwFileOffset>>32,(DWORD)qwFileOffset,qwFileSize-qwFileOffset);
if(lpbMapAddress==NULL)
{
printf("MapViewOfFile失败,错误码为:%d\r\n",GetLastError());
return 0;
}
{
/*do something....*/
}
UnmapViewOfFile(lpbMapAddress);
return 0;
}
------解决方案--------------------
改为
lpbMapAddress=(char*)MapViewOfFile(hFileMap,FILE_MAP_READ,(DWORD)(qwFileOffset>>32),(DWORD)qwFileOffset,T_newmap);
(DWORD)(qwFileOffset>>32)
------解决方案--------------------
感觉可能会有问题,一次映射100*64KB,映射次数多了有可能会失败,进程总共4GB地址空间,可用的不过2G左右,并不能每次都能找到一块连续的这么大的空间,以前就碰到过这种问题,最后只好改成64KB(内存分配粒度大小),有说错的情楼下指正