关于内存映射文件和大文件文本编辑器中的用法

时间:2011-12-12 02:00:40

标签: c++ winapi memory-mapped-files

我目前正在开发一个文本编辑器,理想情况下应该能够处理非常大的文件(理论上是16 eb)。我打算将内存映射文件用于文件管理部分。我在书中Windows via C/C++阅读了一些有趣的例子。我的问题是:

  • 我需要映射的文件偏移量是否必须在64k(或任何分配粒度大小)边界上?
  • 我的第二个问题是,如果是(对第一个问题),那么当我遇到需要文件内容的情况时,映射2个64k视图以保持连续的文本流是否可行从64k边界的两边?例如, 让我们说用户骂到文件中的一个点,我在文件的(64k - 1)中表示数据,这一点位于我的文本编辑器屏幕的中间,这样我需要显示数据范围从(64k - x)到(64k + x)。所以我可以做两个映射,0 - 64k和64k - 64k(我可以形成一个较小的映射,但后来我需要在以后的任何情况下调整映射到64k)。

我不太确定如何构建问题,所以如果你不明白我的意思,我会根据我得到的答案不断更新问题。

1 个答案:

答案 0 :(得分:2)

根据MapViewOfFile的文档,dwFileOffsetLow是:

  

视图要开始的文件偏移量的低阶DWORD。高偏移量和低偏移量的组合必须指定文件映射中的偏移量。它们还必须匹配系统的内存分配粒度。也就是说,偏移量必须是分配粒度的倍数。要获取系统的内存分配粒度,请使用GetSystemInfo函数,该函数填充SYSTEM_INFO结构的成员。

所以第一个问题的答案是肯定的。

你的第二个问题的答案也是肯定的。您可以创建同一文件的多个视图。

文章Managing Memory Mapped Files可能对您有用。

顺便说一句,如果你让你的文本编辑器达到可以测试的程度,我会非常有兴趣看到它。我一直对找到一个优雅地处理非常大的文件的编辑器或文本文件查看器感到绝望。有关一些想法,请参阅Large Text File ViewersDesigning a better text file viewer