我想尝试写一些东西来显示硬盘驱动器的碎片程度。也许甚至可以对其进行碎片整理。
但我意识到我并不完全理解这是如何工作的。
任何人都可以向我解释这一点,也许可以提供一些我可以从哪里开始的建议?
我主要使用 C# - 这是否是一种合适的语言来尝试将某些东西放在一起。
提前致谢
我想尝试写一些东西来显示硬盘驱动器的碎片程度。也许甚至可以对其进行碎片整理。
但我意识到我并不完全理解这是如何工作的。
任何人都可以向我解释这一点,也许可以提供一些我可以从哪里开始的建议?
我主要使用 C# - 这是否是一种合适的语言来尝试将某些东西放在一起。
提前致谢
请从关于磁盘碎片的维基百科文章开始
之后,就看你想走多低层次了。
首先官方howto看MSDN上的碎片整理文件。
从文章中......
- 使用 FSCTL_GET_VOLUME_BITMAP 控制代码在卷上找到一个足以容纳整个文件的位置。注意 如有必要,请移动其他文件以腾出足够大的位置。理想情况下,文件的第一个扩展区之后有足够的未分配簇,您可以将后续扩展区移动到第一个扩展区之后的空间中。
- 使用 FSCTL_GET_RETRIEVAL_POINTERS 控制代码获取磁盘上文件当前布局的映射。
- 遍历 FSCTL_GET_RETRIEVAL_POINTERS 返回的 RETRIEVAL_POINTERS_BUFFER 结构。
- 使用 FSCTL_MOVE_FILE 控制代码在您走动结构时移动每个集群。注意您可能需要更新位图或检索结构,或在其他进程写入磁盘时在不同时间更新两者。
有关上述内容的 C# 包装器,请查看此博客文章。
最后,根据您的情况,您可以在 Win32_Volume 类上使用WMI Defrag 方法。
希望这可以帮助。
要显示文件系统的碎片状态,您必须找出磁盘的哪些块属于哪些文件。所有不完全由连续块组成的文件都是碎片化的;它们包含孔和/或块分散在磁盘上。
要对文件系统进行碎片整理,您必须在块周围移动,以便所有文件都是连续的,并重写元数据以使文件系统最终处于一致状态。
保存文件时,它们使用的字节被放入分配的块中,如果文件增长并且下一个连续块不可用,则操作系统开始写入下一个可用块,将文件分成 2 个片段。
碎片整理通过将块移开(进入空闲空间)将文件收集到连续的块中,以便进行碎片整理的文件可以具有连续的块。对于非固态硬盘,这会影响性能(因为读取连续块没有寻道时间)
一些碎片整理程序将更常用的读取文件移动到磁盘外部(因为它旋转得越快,离主轴越远)。