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的文件内存映射?

解决方案 »

  1.   

    楼主的硬盘是什么分区?FAT32是不能大于 4GB 的
      

  2.   

    32位的cpu只能对应4G的虚拟地址吧
      

  3.   

    CreateFileMapping可以创建很大,但是你MapViewOfFile只能是一段段来
      

  4.   

    这个分页具体如何实现?CreateFileMapping好像只能创建小于等于文件大小的映射吧。
      

  5.   

    HANDLE CreateFileMapping(
      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的文件时。一开始,把文件的开头部分映射到视图中。完成文件的第一个视图的访问后,撤销对文件这部分的映射,然后把文件的另一部分映射到视图中。一直重复这个过程,直到完成对整个文件的访问。