windows上的内存映射文件截断

windows上的内存映射文件截断,windows,memory-mapped-files,memory-mapping,Windows,Memory Mapped Files,Memory Mapping,为什么我们不能在windows上截断内存映射文件?假设我映射了4kb文件,只使用了2kb。所以要截断2kb,我需要首先取消映射映射文件,然后截断它。为什么会这样?API是否有问题,或者我的理解有误 因为在Windows上,一旦映射了文件区域,就无法将其删除 当您将32kb的文件映射到内存中,然后将其截断为0时会发生什么。一旦访问该映射,应该发生什么?在POSIX系统上,内存访问将生成一个可能会使进程崩溃的信号。在Windows上,这是完全不允许的 这种行为应该使使用内存映射文件编程更容易,因为处

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

因为在Windows上,一旦映射了文件区域,就无法将其删除

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

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


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

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