c++ - 设计: Large archive file editor,文件映射

标签 c++ visual-studio winapi file-io

我正在为 4GB 以上的大型归档文件(见下文)编写一个编辑器,使用原生和托管 C++。

为了访问文件,我像任何正常人一样使用文件映射(见下文)。这对于读取数据来说绝对很棒,但在实际编辑存档时会出现问题。 文件映射不允许在访问文件时调整文件大小,所以我不知道当用户想要在文件中插入新数据时我应该如何进行(这将超过文件的原始大小,当它被映射时。)

我应该每次都重新映射整个东西吗?那肯定会很慢。但是,我希望通过独占文件访问让编辑器保持实时,因为这大大简化了编程,并且不会让文件在修改时被其他应用程序搞砸。我不想在编辑器上花费永恒的时间;对于我正在处理的实际项目,它只是一个简单的开发工具。

所以我想听听你们是如何处理类似情况的,以及其他存档软件,尤其是其他游戏如何解决这个问题?

澄清一下:

  • 这不是文本文件,我正在编写特定的二进制归档文件格式。我的意思是目录中包含许多其他文件的大文件。出于多种原因,自定义存档文件在游戏使用中非常普遍。对于我的格式,我的目标是与 Valve Software's GCF format 类似(但更简单)的结构。 - 我会按原样使用 GCF 格式,但不幸的是,该格式没有编辑器,尽管有许多很棒的实现来读取它们,例如 HLLib .

  • 访问文件必须很快,因为它用于存储游戏资源。所以它不是数据库。数据库文件将包含在其中,连同 GFX、SFX 等文件。

  • 此处所说的“文件映射”是 Windows 平台上的一种特殊技术,它允许通过创建部分“ View ”来直接访问大文件,参见此处:http://msdn.microsoft.com/en-us/library/aa366556(VS.85).aspx - 这种技术允许最小的延迟和内存使用,并且是访问任何大文件的明智之选。 所以这意味着将整个 4GB 文件读入内存,恰恰相反。

最佳答案

“编辑器软件”是什么意思?如果这是一个文本文件,您在编写自己的之前是否尝试过现有的生产质量编辑器?如果它是存储二进制数据的文件,您是否考虑过使用 RDBMS 并使用 SQL 语句操作其内容?

如果您绝对必须从头开始编写,我不确定 mmapping 是否可行。映射一个巨大的文件会给你机器的虚拟机系统带来很大的压力,除非文件中有很多编辑操作,否则它的效率可能会落后于简单的读/写方案。更糟糕的是,正如您所说,当您想要扩展文件时会遇到问题。

相反,维护文件数据的缓冲区窗口,用户可以修改这些数据。当用户决定保存文件时,依次遍历文件和编辑缓冲区以创建新的文件图像。如果您有磁盘空间,则写入新文件会更容易(特别是如果缓冲区的大小已更改),否则在用新内容覆盖现有数据之前,您需要聪明地预读现有数据。

或者,您可以记录编辑操作。当用户决定保存文件时,对日志进行拓扑排序并在现有文件上播放以创建新文件。

对于独占文件访问,请使用操作系统的文件锁定或实现应用程序级锁定(如果只有您的编辑器会接触这些文件)。依赖 mmap 进行独占访问会限制您的实现选择。

关于c++ - 设计: Large archive file editor,文件映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/195714/

相关文章:

C++ : const references and initialization order

c++ - 如何按降序排序?

C++ 奇怪的 std::bad_alloc 异常

visual-studio - 单击 Web 应用程序中的文本框时,IIS Express 突然停止

c++ - 如何包含另一个目录中的 DLL

c - 让 C 在继续执行脚本之前等待用户输入一段有限的时间

c++ - Sqlite - 不同的查询,不同的速度?

c++ - 将 Visual C++ Studio/Express 设置为严格的 ANSI 模式

c# - 关于如何在 .NET 的 N 层应用程序中使用强类型数据集的问题

c++ - NtDeviceIoControlFile(查询 IP 地址条目)- STATUS_INVALID_DEVICE_REQUEST