这个问题是根据这个主题: 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 在做什么,但我知道有两种写大文件的方法比你上面做的更快(或者寻找你想要的长度并写一个零,这结果相同)。
这些方法的问题在于它们会在您写入时对文件进行零填充。
您可以通过以下任一方式避免填零:
- 创建一个稀疏文件。大小已标记在您想要的位置,但在您写入数据之前,数据实际上并不存在于磁盘上。所有未写入区域的读取都将返回零。
- 使用SetFileValidData函数来设置有效数据长度而不先将文件清零。但是,由于潜在的安全问题,此命令需要更高的权限。
关于windows - 为什么 fsutil.exe 将大文件写入磁盘所花费的时间比以编程方式花费的时间少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1893200/