如下的代码,当要映谢的文件到达七八百M或更大的时候,就有错了。我想一次性把文件的内容全部映谢进地址空间里,但文件还没超过1G,就有错了。安理说,自己的地址空间有4G,能用的也至少有两G,可为什么出错呢? hFile2=CreateFile((LPCTSTR)file2.GetBuffer(0),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile2==INVALID_HANDLE_VALUE)
{
AfxMessageBox("分割文件失败55!");
CloseHandle(hFile2);
return;
}
hMap=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
if(hMap==NULL)
{
AfxMessageBox("分割文件失败66!");
CloseHandle(hFile);
CloseHandle(hMap);
return;
}
CloseHandle(hFile);
bp=(byte*)MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
if(bp==NULL)
{
AfxMessageBox("分割文件失败77!");
CloseHandle(hMap);
return;
}

解决方案 »

  1.   

    补充:在bp=(byte*)MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);这句出错,反回空指针
      

  2.   

    GetLastError()一下,看看具体错误是啥
      

  3.   

    32位系统的话,进程空间是4G没错,用户空间是2G也没错,但是还有一些资源需要占用内存,比如系统的一些动态库,Kernel32.dll, user32.dll之类的。你要映射整个文件的话,比如800MB的文件,就需要800MB以上的连续空间,有可能你的进程中数据在内存中的分布没办法分配这么大小的连续空间出来。实际上也没必要全部映射进去,可以一次映射100MB,处理完这100MB之后,在映射接下来100MB,直到全部
      

  4.   


    错误代码为8就表示 Not enough storage is available to process this command就是没有足够的空间完成本项操作,4楼说的有理
      

  5.   

    楼主的内存是多少啊,如果可用内存太少,是会出现这样的问题的,毕竟你映射这么大的文件总是要占用一定的内存的,换个大一点的内存就好了,或者如”coding_hello“所说的方法更好