【问题标题】:Memory mapped file truncation on windowsWindows上的内存映射文件截断
【发布时间】:2018-07-12 17:29:08
【问题描述】:

为什么我们不能在 Windows 上截断内存映射文件?假设我已经映射了 4kb 文件并且只使用了 2kb。所以要截断 2kb,我需要先取消映射映射文件,然后截断它。为什么会这样? API有问题还是我的理解有误?

【问题讨论】:

  • 相当基础,而不是它的设计方式。创建一个仅将部分文件内容映射到内存的视图是完全正常的,实际上在过去很常见。它不可能假设程序决定不映射的内容是需要删除的垃圾。例如,当程序崩溃时,真是太可惜了。增大文件不是问题,程序员的意图很明确。
  • 您是否考虑过使用稀疏文件?它不允许你截断文件,但如果你不写入文件的某个区域,它不会占用空间。
  • 我尝试了内存映射文件,我可以看到磁盘上的文件大小与我在 createFileMapping API 中提供的大小相等。因此,即使我没有在文件中写入任何内容,我也会看到非零文件大小。并说要将那个空文件截断一半,我必须先取消映射文件。

标签: windows memory-mapped-files memory-mapping


【解决方案1】:

因为在 Windows 上,一旦文件区域被映射,它就不能被删除。

当您将 32kb 文件映射到内存中,然后将其截断为 0 时会发生什么。访问该映射后会发生什么?在 POSIX 系统上,内存访问会产生一个信号,这可能会使您的进程崩溃。在 Windows 上,这是不允许的。

这种行为应该使内存映射文件的编程更容易,因为处理错误代码比信号处理更容易。

因此,CreateFileMapping 将文件大小扩展到创建的映射对象的大小。

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多