2013-01-15 31 views
4

可能重复的大小:
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); 
} 

请问这项工作。我对此有点内疚,因为我只是打开并重映射 文件,并没有刷新它。我是否需要冲洗它并进行其他操作?

--thanks在advance--

+0

可能重复[如何动态扩展内存映射文件](http://stackoverflow.com/questions/6096485/how-to-dynamically-expand-a-memory-mapped-file)+ [我怎么能扩展一个内存映射文件的长度?](http://stackoverflow.com/questions/7752579/how-can-i-extend-the-length-of-a-memory-mapped-file) –

回答

11

MSDN documentation说两件事情。

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

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

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

其次,(以下简称“返回值”一节中)

“如果对象函数调用之前就存在,该函数返回的句柄现有对象(以其电流的大小,而不是指定大小),并且GetLastError返回ERROR_ALREADY_EXISTS。“

对我而言,这意味着如果您的文件已被映射,您对resize_file()的调用将不起作用。您必须取消映射,请致电resize_file(),然后重新映射它,这可能会或可能不是您想要的。