2013-01-15 32 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(),然後重新映射它,這可能會或可能不是您想要的。