为什么fsutil.exe 需要更少的时间来编写一个巨大的文件进入磁盘上编程方式?

StackOverflow https://stackoverflow.com/questions/1893200

  •  19-09-2019
  •  | 
  •  

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

我只是检查fsutil.exe 在xp/vista/七写大量的虚拟数据的存储磁盘和需要较少时间来编写这样的一个很大的文件相比,programmaticly的方式。

当我试图做同样的事情的帮助。净它将需要相当多的时间比fsutil.exe.

注:我知道这一点。净不要使用机代码的,因为,我只是检查这一问题与本地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);

答案是平等的。净结果。

但是有帮助的fsutil.exe 它只需较少的持续时间比上。净办法说它是2倍的速度

例如:写400mb。净它将采取~40秒 相同的金额fsutil.exe 将采取围绕20secs或更少。

是否有任何解释呢?或其功能fsutil.exe 不会使用有意义的速度来写的?

有帮助吗?

解决方案

我不知道到底是什么fsutil是这样做的,但我知道两种方式编写一个大型文件的速度比你做了什么以上(或者在寻求长你想写一个零,这具有同样的结果)。

该问题与这些方法是他们的零填写该文件的时间你做的编写。

你可以避免的零填补的无论是:

  1. 创建一个疏文件。大小的标志是你想要它,但数据实际上并不存在磁盘上直到你写信。所有读取的不成文的区域会回零。
  2. 使用 SetFileValidData 功能设置的有效数据的长度而没有零的文件的第一个。然而,由于潜在的安全问题,这个命令要求更高的权限。

其他提示

我同意最后的评论。我用微过滤驱动器实验和在回调中捕获IRP_MJ_WRITE的IRP。当我创建或写入从CMD线或Win32应用程序的文件,我可以看到的写下来。但是,当我使用“FSUTIL文件createnew ......”创建文件的命令,我没有看到任何写操作。我看到在NTFS卷上win2k8 R2此行为。而且我不认为(不知道,虽然100%)它是一个稀疏文件要么。这可能是在设置MFT大小的属性没有分配任何集群。 FSUTIL做检查的可用空间,因此,如果文件大小大于可用磁盘空间更大,你会得到错误1。

我也跑程序sening FSCTL_GET_RETRIEVAL_POINTERS到文件和我一个程度为文件的整个尺寸。但我相信这是获取所有数据

这是什么东西可以

  • 写的汇编(原惊人的速度)
  • 一个地C/C++编码做这个
  • 可能是无证件的系统,叫做这个或一些把戏是不是记录下任何地方。

上述三点可能会有巨大的重要因素-当你想它的时候。净码是装载的,它得到jit情况下,原由运行(确定,时间因素不会被明显的,如果你有一个炽热的快速机器上的一个卑微的结束奔腾的,这将是明显的,慢吞吞的装载)。

更可能的是,它可能已经编写的C/C++。它可能会让你大吃一惊如果它被写在汇编器。

你可以检查这个为自己-看看文件的大小可执行和进行比较。净的可执行的。你可能会认为该文件是压缩,我怀疑它会因此被倾向于规则这一点,Microsoft不会走那么远,我觉得有压缩的可执行文件业务。

希望这回答你的问题 最好的问候, 汤姆。

FSUTIL仅快于NTFS和exFAT的,而不是在FAT32,FAT16 这是因为一些文件系统有一个“初始化大小” concespt,从而支持快速文件初始化。这只是保留簇但不为零出来,因为它在文件系统中指出,没有数据写入到文件,并有效读取都会返回00填充缓冲区。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top