增加内存映射文件的大小[重复]

2024-02-22

可能的重复:
如何动态扩展内存映射文件 https://stackoverflow.com/questions/6096485/how-to-dynamically-expand-a-memory-mapped-file

你好,我有一个树状数据结构存储在 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);
}

这行得通吗?我对此感到有点内疚,因为我只是打开并重新映射文​​件而没有刷新它。我需要冲洗它并进行其他操作吗?


The 文档 https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw说了两件事。

首先(在“Remarks“ 部分),

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

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

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

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

对我来说,这意味着您的电话resize_file()如果您的文件已经映射,则不会有任何影响。你必须取消映射它,打电话resize_file(),然后重新映射它,这可能是也可能不是您想要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

增加内存映射文件的大小[重复] 的相关文章

随机推荐

  • Xcode UI 测试手册快照

    我想使用 Xcode 7 中引入的 UI 测试手动从我的应用程序中截取一些快照 默认情况下 Xcode 会截取每个步骤的屏幕截图 结果我得到了在视图控制器之间的转换中间截取的屏幕截图 我想在特定时刻手动拍摄快照 有什么想法如何做到这一点 我
  • 如何使用 numba 在 GPU 上推广快速矩阵乘法

    最近 我一直在尝试使用 Numba 库在 Python 中进行 GPU 编程 我一直在他们的网站上使用那里的教程阅读它 目前我陷入了他们的示例 可以在这里找到 https numba pydata org numba doc latest
  • ARKit 中的 ChromaKey 视频

    我正在尝试在 ARKit 中对视频进行色度键控 我所做的与 Felix 在这里所做的非常相似 SKScene 中的 GPUImageView 作为 SKNode 材质 在 ARKit 上播放透明视频 https stackoverflow
  • 如何配置 AngularFireAuthModule 和/或 AngularFireAuth 以指向身份验证模拟器

    我相信 auth 模拟器是在 2020 年 10 月底发布的 验证模拟器功能请求 https github com firebase firebase tools issues 1677我正在尝试配置我的本地服务的角度应用程序以通过让 An
  • epplus 使用 LoadFromCollection 和匿名类型

    我有一个IEnumerabledataSource 其中包含匿名类型的集合 匿名类型的实际结构在设计时是未知的 因此我试图找到一个可以处理任何匿名类型的通用解决方案 如何将它们加载到 epplus 中以创建电子表格 我有一个名为 ws 的工
  • 如何在绘图中添加注释水平或垂直参考线?

    如果这很重要的话 我正在使用 plotly 来进行 R 输出 并使用 shiny 我想向由以下命令创建的水平或垂直参考线添加注释layout shapes 它应该能够动态改变位置 以便无论图表如何放大或缩小 它都保持可见 近似示例 http
  • C 语言:if() 没有 else():使用大括号失败

    我对 IF 表达式后是否需要大括号感到困惑 当使用 IF ELSE 时 我习惯在 IF 和 ELSE 块周围使用大括号 但是当我不使用 ELSE 块时 它可以在没有大括号的情况下工作 并且在有大括号的情况下失败 工作原理 IF 失败 IF
  • 机器人框架 - UnicodeDecodeError:“ascii”编解码器无法解码位置 49 中的字节 0xe9:输入文本时序号不在范围(128)内

    我正在使用 selenium 从数据库查询值以在输入字段中输入 但是 对于某些值 我收到以下错误 UnicodeDecodeError ascii 编解码器无法解码字节 0xe9 位置 49 序数不在范围内 128 当在文本字段中输入的值类
  • 重载 && 和 || 实际上是否有原因?不短路吗?

    运营商的短路行为 and 对于程序员来说是一个了不起的工具 但为什么它们在超载时会失去这种行为呢 我知道运算符只是函数的语法糖 但运算符bool有这种行为 为什么要限制为这种单一类型 这背后有什么技术原因吗 所有设计过程都会导致相互不兼容的
  • 将现有 Webdriver 对象传递给 Robot Framework 的自定义 Python 库

    我正在尝试为 Robot Framework 创建自定义 Python 库 但我对 Python 和 Robot 很陌生 并且不确定如何完成我想要做的事情 我想将 Robot 使用 Selenium2Library 创建的 Webdrive
  • 具有自定义注册控制器的设置设备

    我正在使用 devise 开发一个 Rails 站点 我们还不希望用户注册 用户身份验证使我们可以登录以访问网站的受限部分并添加 编辑我们认为合适的内容 所以现在 我创建了以下控制器 class Users RegistrationCont
  • 如何检查日期是否在日期字符串列表中?

    这将始终打印 false 如何检查日期是否在数组中并打印正确的内容 dates 2012 09 03 2012 10 08 2012 10 09 2012 11 12 more values snipped for brevity 2013
  • 圆柱/圆锥上均匀生成 3D 点

    我希望在圆柱体和圆锥体上 分别 随机且均匀地生成点 圆柱体由其中心 半径和高度定义 锥体规格相同 我能够获得每个形状的边界框 因此我正在考虑在边界框内生成点 但是 我不确定如何将它们投影到圆柱体 圆锥体上 或者这是否是最好的主意 有什么建议
  • Redis 模仿 MASTER/MASTER?或者是其他东西?

    我已经阅读了这里的很多帖子并上网冲浪 但也许我没有问正确的问题 我知道 Redis 目前是主 从 直到 Cluster 可用 但是 我想知道是否有人可以告诉我如何在逻辑上配置 Redis 以满足我的需求 或者它是否不是正确的工具 设想 我们
  • 如何使用 XPath/XSLT fn:json-to-xml

    我需要将 JSON 字符串转换为 XML 字符串 标签确实包含属性 从答案中this https stackoverflow com questions 38783463 how to convert badgerfish style js
  • 多线程访问LinkedList时的线程安全

    我的应用程序需要保留对特定资源的请求的访问日志 并且多个线程将记录日志条目 唯一相关的信息是请求的时间戳 检索的统计信息将是过去 X 秒内发生的请求数量 返回给定秒数的统计信息的方法还需要支持多线程 我正在考虑使用以下方法来处理并发处理Lo
  • 列出多个jar文件的内容

    我正在一堆罐子里寻找 class 文件 jar tf abc jar 适用于一个文件 我试过 find name jar xargs jar tf 不打印任何内容 我能想到的唯一解决方案是全部解压 然后搜索 有没有更好的办法 我在 LUni
  • 我如何判断 RenderAction 是否正在调用我的操作?

    我有一个可能通过普通链接调用的操作 在这种情况下我会返回 View 或者也可以通过 AJAX 或 RenderAction 即作为子操作 调用它 在这种情况下我会返回一个 PartialView 整理 AJAX 部分很容易 但如何测试我的操
  • 尝试执行restclient请求时找不到合适的HttpMessageConverter

    我正在尝试使用Spring for Android rest client发送数据http post 以避免创建和解析 json 数据 来自他们的manual http static springsource org spring andr
  • 增加内存映射文件的大小[重复]

    这个问题在这里已经有答案了 可能的重复 如何动态扩展内存映射文件 https stackoverflow com questions 6096485 how to dynamically expand a memory mapped fil