san*_*ika 6 c c++ windows winapi
可能重复:
如何动态扩展内存映射文件
嗨我有一个像数据结构的树,存储在Windows中的内存映射文件中.当我需要插入一条记录时,我正在检查它的自由指针是否更靠近文件末端.但真正的问题是关于调整文件大小.
在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);
}
Run Code Online (Sandbox Code Playgroud)
这会有用吗 我对此有点内疚,因为我只是打开并重新映射文件并且没有刷新它.我是否需要冲洗它并进行任何其他操作?
- 提前致谢 -
And*_*owl 11
在MSDN文档说两件事情.
首先(在" 备注 "部分),
"如果应用程序指定文件映射对象的大小大于磁盘上实际命名文件的大小,并且页面保护允许写访问(即flProtect参数指定PAGE_READWRITE或PAGE_EXECUTE_READWRITE),则磁盘上的文件会增加匹配文件映射对象的指定大小.如果文件被扩展,文件的旧结尾和文件的新结尾之间的文件内容不保证为零;行为由文件定义系统"
这基本上意味着当您将文件映射到大于调用文件的内存区域时,磁盘上的文件会被调整大小CreateFileMapping(),并用未指定的内容填充它.
其次(在" 返回值 "部分),
"如果对象在函数调用之前存在,则该函数返回现有对象的句柄(具有当前大小,而不是指定大小),并GetLastError返回ERROR_ALREADY_EXISTS."
对我而言,这意味着resize_file()如果您的文件已经映射,您的调用将无效.您必须取消映射,调用resize_file(),然后重新映射它,这可能是您想要的,也可能不是.
| 归档时间: |
|
| 查看次数: |
6720 次 |
| 最近记录: |