为什么fsutil.exe花费较少的时间将大文件写入磁盘而不是以编程方式?

Sey*_*emi 3 windows file-io fsutil

这个问题是根据这个主题: 在c#中在几秒钟内创建一个巨大的虚拟文件

我刚刚检查了xp/vista/7中的fsutil.exe,将大量虚拟数据写入存储磁盘,与编程方式相比,编写这么大的文件所需的时间更少.

当我在.net的帮助下尝试做同样的事情时,它将比fsutil.exe花费更多的时间.

注意:我知道.net不使用本机代码,因为我刚刚使用native api检查了这个问题,如下所示:

long int size = DiskFree('L' - 64);
const char* full = "fulldisk.dsk";
__try{
Application->ProcessMessages();
HANDLE hf = CreateFile(full,
                       GENERIC_WRITE,
                       0,
                       0,
                       CREATE_ALWAYS,
                       0,
                       0);
SetFilePointer(hf, size, 0, FILE_BEGIN);
SetEndOfFile(hf);
CloseHandle(hf);
}__finally{
    ShowMessage("Finished");
    exit(0);
Run Code Online (Sandbox Code Playgroud)

答案和.net结果一样平等.

但是在fsutil.exe的帮助下,它只需要比上面更短的持续时间或.net方法说它快2倍

例如:对于使用.net写入400mb,使用fsutil.exe大约需要大约20秒或更少,大约需要40秒.

那有什么解释吗?或哪个函数fsutil.exe确实使用具有这种显着速度的函数?

Ric*_*kNZ 5

我不知道fsutil究竟在做什么,但我知道有两种方法可以编写一个比你上面所做的更快的大文件(或者寻找你想要的长度并写一个零,它具有相同的结果).

这些方法的问题在于它们在您执行写入时将文件归零.

您可以通过以下任一方式避免零填充:

  1. 创建稀疏文件.大小标记在您想要的位置,但在您编写之前,数据实际上并不存在于磁盘上.所有未写区域的读取都将返回零.
  2. 使用SetFileValidData函数设置有效数据长度而不先将文件归零.但是,由于潜在的安全问题,此命令需要提升权限.