SetFileValidData在做什么?与SetEndOfFile有什么区别?

wen*_*ibo 10 windows file

我寻找一种异步和高效扩展文件的方法.

在支持文档中异步磁盘I/O在Windows NT,Windows 2000和Windows XP上显示为同步说:

注意:应用程序可以通过使用SetFileValidData函数更改文件的有效数据长度,然后发出WriteFile,使前面提到的写操作异步.

在MSDN中,SetFileValidData是一个功能Sets the valid data length of the specified file.

但我仍然不明白什么是"有效数据",它与文件大小有什么区别?

我可以使用SetFilePointerExSetEndOfFile扩展文件大小,但是这个怎么做SetFileValidData

SetFileValidData无法输入大于文件大小的参数.在这种情况下,生命的意义是SetFileValidData什么?

Har*_*ton 24

当您使用SetEndOfFile增加文件的长度时,逻辑文件长度会更改并分配必要的磁盘空间,但实际上没有数据物理写入与文件新部分对应的磁盘扇区.有效数据长度保持不变.

这意味着您可以SetEndOfFile非常快速地使文件非常大,如果您从文件的新部分读取,您将获得零.将实际数据写入文件的新部分时,有效数据长度会增加.

如果您只想保留空间,那就没关系,然后将按顺序将数据写入文件.但是如果你使文件非常大并立即在其末尾写入数据,则需要将零写入文件的新部分,这将花费很长时间.如果您实际上不需要该文件包含零,则可以使用SetFileValidData跳过此步骤; 然后,文件的新部分将包含先前删除的文件中的随机数据.

  • 这个答案非常简洁,应该选择正确的答案. (2认同)

小智 6

请注意,SetEndOfFile()不会将任何零写入磁盘上任何已分配的扇区,它只是在 MFT 记录内分配空间指针,然后更新整个文件系统的空间位图。但是操作系统或 FS 将在其 MFT 记录中记录有效/逻辑文件长度。

如果你把文件从1GB放大到2GB,那么附加的1GB应该都是零,但是FS不会把零写入磁盘,它是指这个文件的有效长度才知道1GB应该是零。如果您尝试读取这个放大的 1GB 部分,它将直接在 RAM 中填充零,然后反馈给您的应用程序。但是,如果您在这 1GB 部分中写入任何字节,则 FS 必须填充从原始 1GB 偏移量到您的应用程序试图写入的当前指针的零,而不是从当前位置到尾部的其他字节文件。同时,它记录了从0到当前位置的有效/逻辑长度,物理大小和分配的大小仍然是2GB。

但是,如果您使用SetFileValidData(),FS 将直接将有效长度设置为 2GB,并且不会费心填充任何零。无论您写入到哪个位置,它都会写入,但是无论您从哪个位置读取,您都可能会读出一些垃圾数据,这些数据是在文件扩展到该磁盘空间之前由其他应用程序生成的。