我写了一段文件映射的程序,块大小设置为512M,经测试运行成功,取名为工程A;之后给工程A添加功能,复制了A的附件,并在A的基础上添加功能按钮,原有程序没变过,新工程取名B;
问题来了,B的文件映射怎么招都失败,错误代码8,内存不足;但是A怎么招都运行的起来;之后给B的块大小设置为256M又是怎么招都运行的起来,改回原来的大小又是内存不足;这到底是为嘛子啊为嘛子,求大侠解决问题
问题来了,B的文件映射怎么招都失败,错误代码8,内存不足;但是A怎么招都运行的起来;之后给B的块大小设置为256M又是怎么招都运行的起来,改回原来的大小又是内存不足;这到底是为嘛子啊为嘛子,求大侠解决问题
看看它是不是太大。FileMaxSize类型是 ULONGLONG,或者其它8字节类型。
是在这行出来的? MessageBox("创建文件映射对象失败,错误代码");
HANDLE hFile = NULL;
HANDLE hFileMap = NULL;
const viewmapsize = 8 * 1024 * 1024;//8m
DWORD highsize,lowsize,fileoffsetlow,fileoffsethigh,mapsize;
_int64 filesize,offset,remain;
int dwError;do {
//打开文件
hFile= CreateFile("g:\\1289527402.png",
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( hFile == INVALID_HANDLE_VALUE )
{
CString cs;
cs.Format("打开文件失败:%d",GetLastError());
AfxMessageBox(cs);
break;
}
lowsize = GetFileSize(hFile,&highsize);
if ( lowsize == 0xFFFFFFFF && ( dwError = GetLastError() ) != NO_ERROR )
{
CString cs;
cs.Format("获取文件大小失败:%d",dwError);
AfxMessageBox(cs);
break;
}
//文件大小
filesize = highsize<<32 | lowsize;
hFileMap = CreateFileMapping(hFile,NULL,
PAGE_READONLY,
highsize,
lowsize,
NULL);
if ( hFileMap == NULL )
{
CString cs;
cs.Format("建立CreateFileMapping失败:%d",GetLastError());
AfxMessageBox(cs);
break;
}
offset = 0;
mapsize = (int)(filesize > viewmapsize ? viewmapsize : filesize);
fileoffsethigh = (int)(offset >> 32);
fileoffsetlow = (int)(offset / viewmapsize * viewmapsize);
LPVOID lpmap;
while ( filesize > offset && ( lpmap = MapViewOfFile(hFileMap,FILE_MAP_READ,fileoffsethigh,fileoffsetlow,mapsize) ) != NULL )
{
offset += mapsize;
remain = filesize - offset;
mapsize = (int)(remain > viewmapsize ? viewmapsize : remain);
fileoffsethigh = (int)(offset >> 32);
fileoffsetlow = (int)(offset);
UnmapViewOfFile(lpmap);
}
if ( lpmap == NULL )
{
CString cs;
cs.Format("建立MapViewOfFile失败:%d",GetLastError());
AfxMessageBox(cs);
break;
}
else
UnmapViewOfFile(lpmap);
if ( filesize == offset )
AfxMessageBox("映射文件结束");
}while (0);if ( hFileMap )
CloseHandle(hFileMap);
if (hFile)
CloseHandle(hFile);
map的问题...用MapViewOfFile处理大文件时,如果文件过大,则无法一次性映射入内存,否则会出现1132错误,即内存不足。原因可能为操作系统无法找到连续的内存。因此需要通过分页的方式,逐页将文件内容映射到内存你试着改小一点,或者直接是64K