从网上看说内存映射文件的大小在运行期是不能被更改的,是否是这样? 
如果我想增加映射文件的内容时,就要在创建的时候创建一个足够大的内存对象,这样如果我用不了这么多空间,保存的文件后面是不是会有一大堆空白的地方? 
请大侠指教 我把一段代码贴上来,是DELPHI的,加了注释 procedure TForm1.btnCreateClick(Sender: TObject); 
var 
  PText, Ps: PChar; 
  ErrorID: DWord; 
  strSource: string; 
begin 
  // 文件句柄 
  fHandle := CreateFile(PChar('c:\response.txt'), GENERIC_READ or GENERIC_WRITE, 
                      FILE_SHARE_READ, nil, OPEN_EXISTING, 
                      FILE_FLAG_SEQUENTIAL_SCAN, 0); 
  // 用fHandle创建内存映射对象,大小为500字节 
  MapViewHandle := CreateFileMapping(fHandle, 0, PAGE_READWRITE, 0, 500, 'MapViewTest'); 
  // 获取映射对象的指针地址 
  PText := MapViewOfFile(MapViewHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
  // 给字符串变量赋值 
  strSource := '123fjfjsoijdfoiejflkdsjflsjdfoiejwoijfsjdfljd'; 
  // 将字符串内容复制到映射对象中 
  StrCopy(PText, PChar(strSource)); 
  // 关闭映射对象和文件句柄 
  CloseHandle(MapViewHandle); 
  CloseHandle(fHandle); 
end; 这个过程对txt文件进行了修改,文本文件的内容为'123fjfjsoijdfoiejflkdsjflsjdfoiejwoijfsjdfljd'后面由很多个空格,就是把500个字符填充满了

解决方案 »

  1.   

    MapViewOfFileEx可以設定io的地址以及範圍。還有建立內存映射的內存頁時是需要頁對齊滴,實際運用中沒有是500字节這種編寫方法的。
      

  2.   

    确实会浪费,因为当时memset了一大块的0.
      

  3.   

    其实可以在CreateFileMapping之前先取文件大小就不会浪费了
    然后,在需要更大空间的时候,释放掉原来的handle计算好大小再重新CreateFileMapping一次