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

C++ 关于内存映射文件和大文件文本编辑器中的使用,c++,winapi,memory-mapped-files,C++,Winapi,Memory Mapped Files,我目前正在开发一个文本编辑器,理想情况下应该能够处理非常大的文件(理论上是16 eb)。我计划在文件管理部分使用内存映射文件。我在书《通过C/C++打开Windows》中读到了一些有趣的例子。我的问题是: 我需要映射的文件偏移量是否必须在64k(或任何分配粒度大小)边界上 我的第二个问题是,如果是(第一个问题),那么当我遇到需要从64k边界两侧获取文件内容的情况时,映射2个64k视图以保持连续的文本流是否可行?例如 假设用户SCOLs横跨到文件中的一个点,在那里我有文件(64K—1)中表示的数

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

  • 我需要映射的文件偏移量是否必须在64k(或任何分配粒度大小)边界上
  • 我的第二个问题是,如果是(第一个问题),那么当我遇到需要从64k边界两侧获取文件内容的情况时,映射2个64k视图以保持连续的文本流是否可行?例如 假设用户SCOLs横跨到文件中的一个点,在那里我有文件(64K—1)中表示的数据,这一点位于文本编辑器的屏幕中间,这样我需要显示范围从(64K-X)到(64K+X)的数据。因此,我可以创建两个映射,0-64k和64k-64k(我可以创建一个较小的映射,但之后我需要将映射大小调整为64k)

我不太确定如何界定这些问题,所以如果你不明白我的意思,我会根据我得到的回答不断更新这些问题

根据的文档,
dwFileOffsetLow
是:

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

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

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

这篇文章可能对你有用


顺便说一句,如果你把你的文本编辑器放到可以测试的地方,我会很有兴趣看一看。我一直对找到一个能优雅地处理超大文件的编辑器或文本文件查看器感到失望。请参阅和了解一些想法。

注意,路线必须位于64K边界上,但您可以一次映射64K以上的边界(例如128K视图)。另外,映射3个视图可能是一个好主意,因为您可能会向两个方向滚动。我正在考虑在用户接近特定映射的末尾时映射下一个/上一个视图。谢谢!目前我还没有实现文件后端。我为这个项目制作了一个自定义的编辑控件,所以我正试图消除尽可能多的bug,并使控件具有足够的可伸缩性,以正确显示大文件。一旦准备好了,我会告诉你的。@JimMischel:我使用WinVi(),但没有注意到处理其中的大文件时有任何问题。