磁盘去碎片如何工作?

时间:2010-02-12 13:31:39

标签: c# fragmentation defragmentation

我想写一些能够显示硬盘驱动器状态的内容。也许甚至可以去除碎片。

但我意识到我并不完全明白这是如何运作的。

任何人都可以向我解释这个问题,或许可以就我可能从哪里开始提出一些建议吗?

我主要使用C# - 这是一种合适的语言,可以放在一起。

提前致谢

3 个答案:

答案 0 :(得分:4)

请从Disk Fragmentation

上的维基百科文章开始

然后,这取决于你想要去的低级别。

首先是官方如何在MSDN上查看Defragmenting Files

从文章....

  
      
  1. 使用FSCTL_GET_VOLUME_BITMAP控制代码在卷上找到足够大的位置以接受整个文件。     注意如有必要,请移动其他文件以创建足够大的位置。理想情况下,在文件的第一个范围之后有足够的未分配的集群,您可以将后续扩展区移动到第一个扩展区之后的空间中。
  2.   
  3. 使用FSCTL_GET_RETRIEVAL_POINTERS控制代码获取磁盘上文件当前布局的映射。
  4.   
  5. 走FSCTL_GET_RETRIEVAL_POINTERS返回的RETRIEVAL_POINTERS_BUFFER结构。
  6.   
  7. 使用FSCTL_MOVE_FILE控制代码在您移动结构时移动每个群集。     注意当其他进程写入磁盘时,您可能需要在不同时间更新位图或检索结构,或两者都更新。
  8.   

对于上述的C#包装器,请查看此blog post

最后,根据您的具体情况,您可以使用Win32_Volume类上的WMI Defrag method

希望这有帮助。

答案 1 :(得分:0)

要显示文件系统的碎片状态,您必须找出磁盘的哪些块属于哪些文件。所有不仅仅由连续块组成的文件都是碎片化的;它们包含孔和/或块分散在磁盘上。

要对文件系统进行碎片整理,您必须在块中移动,以便所有文件都是连续的,并重写元数据,以使文件系统最终处于一致状态。

答案 2 :(得分:0)

当保存文件时,它们使用的字节被放入已分配的块中,如果文件增长并且下一个连续块不可用,则操作系统开始写入下一个可用块,将文件拆分为2个片段。

碎片整理通过将块移开(进入可用空间)将文件收集到连续的块中,以便被碎片整理的文件可以具有连续的块。对于非固态硬盘驱动器,这会影响性能(因为没有寻找时间读取连续的块)

有些碎片整理程序会将更常见的读取文件移动到磁盘外部(因为它离主轴越远越快旋转)。