CFile hFile;
HANDLE hMapfile;
HANDLE hMapview;
char *recv;
hFile.Open(_T("g:\\map.txt"),CFile::modeReadWrite);
if (hFile.m_hFile==hFile.hFileNull)
{
printf("open file failed!\n");
return 1;
}
hFile.SetLength(6442450944);
hMapfile=CreateFileMapping(hFile.m_hFile,NULL,PAGE_READWRITE,0,0,_T("MapTest"));
if(hMapfile==NULL)
{
printf("mapping file failed!\n");
return 1;
}
hFile.Close();
hMapview=MapViewOfFile(hMapfile,FILE_MAP_WRITE,0,0,0);
if(hMapview==NULL)
{
printf("mapping view failed!\n");
return 1;
}
recv=(char *)hMapview;
/*..*/
UnmapViewOfFile(hMapview);
return 0;
以上代码把个g:\map.txt文件设置成6GB,然后创建文件映射,就显示“mapping file failed!”,难道不能映射大于4GB的文件内存映射?
HANDLE hMapfile;
HANDLE hMapview;
char *recv;
hFile.Open(_T("g:\\map.txt"),CFile::modeReadWrite);
if (hFile.m_hFile==hFile.hFileNull)
{
printf("open file failed!\n");
return 1;
}
hFile.SetLength(6442450944);
hMapfile=CreateFileMapping(hFile.m_hFile,NULL,PAGE_READWRITE,0,0,_T("MapTest"));
if(hMapfile==NULL)
{
printf("mapping file failed!\n");
return 1;
}
hFile.Close();
hMapview=MapViewOfFile(hMapfile,FILE_MAP_WRITE,0,0,0);
if(hMapview==NULL)
{
printf("mapping view failed!\n");
return 1;
}
recv=(char *)hMapview;
/*..*/
UnmapViewOfFile(hMapview);
return 0;
以上代码把个g:\map.txt文件设置成6GB,然后创建文件映射,就显示“mapping file failed!”,难道不能映射大于4GB的文件内存映射?
HANDLE hFile, // handle to file
LPSECURITY_ATTRIBUTES lpAttributes, // security
DWORD flProtect, // protection
DWORD dwMaximumSizeHigh, // high-order DWORD of size
DWORD dwMaximumSizeLow, // low-order DWORD of size
LPCTSTR lpName // object name
);
如果要想用当前的文件大小创建一个文件映射对象,那么只要dwMaximumSizeHigh,dwMaximumSizeLow都为0就可以了。这两个参数分别指定映射对象的size的高32位和低32位。
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // handle to file-mapping object
DWORD dwDesiredAccess, // access mode
DWORD dwFileOffsetHigh, // high-order DWORD of offset
DWORD dwFileOffsetLow, // low-order DWORD of offset
SIZE_T dwNumberOfBytesToMap // number of bytes to map
);
在映射大于4gb的文件时。一开始,把文件的开头部分映射到视图中。完成文件的第一个视图的访问后,撤销对文件这部分的映射,然后把文件的另一部分映射到视图中。一直重复这个过程,直到完成对整个文件的访问。