增加内存映射文件的大小

时间:2013-01-15 14:38:50

标签: c++ c windows winapi

  

可能重复:
  How to dynamically expand a Memory Mapped File

嗨,我有一个像数据结构的树,存储在内存映射文件中 视窗。当我需要插入记录时,我会检查它是否是自由指针 离文件末端更近了。但真正的问题是关于调整文件大小。

在Windows文档中,有人说,`CreateFileMapping'将调整大小 根据它的参数文件。所以我决定像下面那样使用它。

    #define SEC_IMAGE_NO_EXECUTE 0x11000000

static void resize_file(wchar_t * file_name,int size)
{
  hFile = CreateFile(file_name,GENERIC_READ|GENERIC_WRITE,0,\
                     NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,\
                        NULL);
  if (hFile == INVALID_HANDLE_VALUE)
  {
    MessageBox(NULL,L"resize_file CreateFile have been failed" ,szAppName,MB_OK);
    exit(0);
  }

  // open file mapping object //
  HANDLE hMap = CreateFileMapping(hFile,NULL,PAGE_EXECUTE_READWRITE|SEC_IMAGE_NO_EXECUTE,0,size,NULL);

  // Close files and mapping //
  CloseHandle(hMap); 
  CloseHandle(hFile);
}

这会有效吗?我对此有点内疚,因为我只是打开并重新映射 文件并没有冲洗它。我是否需要冲洗它并进行任何其他操作?

- 提前感谢 -

1 个答案:

答案 0 :(得分:11)

MSDN documentation说了两件事。

首先(在“备注”部分中),

“如果应用程序指定文件映射对象的大小大于磁盘上实际命名文件的大小,并且页面保护允许写访问(即flProtect参数指定PAGE_READWRITEPAGE_EXECUTE_READWRITE),然后增加磁盘上的文件以匹配文件映射对象的指定大小。如果文件已扩展,则文件内容文件的旧结尾和文件的新结尾之间不保证为零;行为由文件系统“

定义

这基本上意味着当您将文件映射到大于调用CreateFileMapping()的文件的内存区域时,磁盘上的文件会被调整大小,并用未指定的内容填充它。

其次(在“返回值”部分中),

“如果对象在函数调用之前存在,则该函数返回现有对象的句柄(具有当前大小,而不是指定大小)和GetLastError返回ERROR_ALREADY_EXISTS。“

对我而言,这意味着如果您的文件已经映射,那么您对resize_file()的调用将无效。您必须取消映射,调用resize_file(),然后重新映射它,这可能是您想要的,也可能不是。