windows - 为什么 fsutil.exe 将大文件写入磁盘所花费的时间比以编程方式花费的时间少?

标签 windows file-io fsutil

这个问题是根据这个主题: creating a huge dummy file in a matter of seconds in c#

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

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

注意:我知道 .net 不使用 native 代码,因为我刚刚用 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);

答案与 .net 结果一样。

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

例子: 使用 .net 写入 400mb 需要大约 40 秒 与 fsutil.exe 相同的数量将花费大约 20 秒或更少。

有什么解释吗? 或者 fsutil.exe 确实使用了哪个函数具有如此重要的写入速度?

最佳答案

我不确切知道 fsutil 在做什么,但我知道有两种写大文件的方法比你上面做的更快(或者寻找你想要的长度并写一个零,这结果相同)。

这些方法的问题在于它们会在您写入时对文件进行零填充。

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

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

关于windows - 为什么 fsutil.exe 将大文件写入磁盘所花费的时间比以编程方式花费的时间少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1893200/

相关文章:

linux - 使用 GNU 并行时输出到文件的最快方法

windows - fsutil - setCaseSensitiveInfo 后不支持请求

windows - TThread 等待用户输入

windows - 如何获取 Windows 7 上所有服务的列表?

c - 在C编程中使用结构体的双指针将矩阵从文本文件读取到二维数组中

windows - fsutil 硬链接(hard link)不起作用?

c++ - fsutil queryfilenamebyid 命令的 Winapi 等价物

c++ - 指向任意函数的 "general function signature"指针

windows - 如何让 git 停止更改文件中的换行符?

C# Directory 列出海量目录