用内存映射的方法把一个文件加载进来没有问题。
但是,如果是个大文件,就会出错。
  FFileHandle:=CreateFile(PChar(AFileName),GENERIC_ALL,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  FSize:=Windows.GetFileSize(FFileHandle,nil);
  FMappingHandle:=CreateFileMapping(FFileHandle,nil,PAGE_EXECUTE_READWRITE,0,0,nil);
  FMemory:=MapViewOfFile(FMappingHandle,FILE_MAP_READ,0,0,0);
  if FMemory=nil then raise Exception.Create('FMemory=nil'); // 这里小文件不会成nil,大文件就是nil请教有能解决的吗?

解决方案 »

  1.   

    不能超过2G,因为用户模式下地址空间只有2G,而且这2G还包括  kernel32.dll,   gdi32.dll,   user32.dll之类的东西,大文件没法映射,只能映射部分文件
      

  2.   

    如果不是追求效率,DELPHI 7以上版本的TFileStream都支持处理大文件,如果追求效率可以采用MapViewOfFile的分页机制,这样在处理效率上会有提高,特别是磁盘碎片很多的情况下。
    映射大文件你要这么用MapViewOfFile(FMapHandle, FILE_MAP_READ,
        OffsetHigh, OffsetLow, NumberOfBytesToMap);而不是都传入0
      

  3.   

    本帖最后由 Avan_Lau 于 2010-03-18 11:34:06 编辑
      

  4.   

    采用分页机制吧。
    例如设定每次映射大小为50M,首先映射第一个50M,处理完后,映射第二个50M。
    FileMapping本身支持offset的。