如何在 Windows (NTFS) 上预分配文件而不写入整个文件

问题描述 投票:0回答:1

我有一个应用程序需要为磁盘上可能非常大的文件(几TB)预先分配空间。该文件应该占用磁盘上的空间,这样分配的空间就不能被其他东西使用。

使用SetFileInformationByHandleSetFilePointerExhttps://stackoverflow.com/a/25119897/3806795中建议的SetEndOfFile确实实现了分配,但有一个大问题:当我在接近结尾处写一些东西时分配的文件后,Windows 似乎开始将整个实际文件写入磁盘(我假设用零填充文件开头和实际写入之间的间隙)。

这会导致“系统”进程使用 100% 的磁盘 I/O,直到写入完成,您可以想象,对于多 TB 文件,即使在 SSD 上也会花费一段时间,并浪费其写入资源,尤其是当文件被写入时。接近驱动器本身的尺寸。

有没有一种方法可以在 Windows 10/11 (NTFS) 上分配非稀疏文件而不会出现此类问题?我在 Linux 上使用

fallocate
时没有遇到此类问题。

windows filesystems ntfs
1个回答
0
投票

原始场景中发生的情况是文件已完全分配,但 VDL(有效数据长度)设置为零。 VDL 是文件中有效数据的高水位线。当写入超出 VDL 时,NTFS 必须将当前 VDL 与写入新数据的开头之间的所有空间清零。这是一项安全要求,目的是不向新用户公开磁盘以前的内容。

在最初的场景中,这就是 IO 开始发生的原因,因为要将 VDL 推进到数据写入的位置,它必须将中间的所有内容归零。

有一种方法可以通过 SetFileValidData API 解决此问题 (https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfilevaliddata)。请注意,这只能从提升的管理应用程序中完成,并且被认为是一个安全问题,因为以前的磁盘上下文正在暴露。

如上所述,使用稀疏文件是另一种选择。

系统的运行符合设计。

© www.soinside.com 2019 - 2024. All rights reserved.