【问题标题】:Programmatically determine a file's fragmentation status以编程方式确定文件的碎片状态
【发布时间】:2011-02-01 05:24:49
【问题描述】:

是否可以确定特定文件的碎片状态(即该文件占用的不同碎片的数量)? 如果是这样,如何使用.net 来完成?

动机是这样的:我的应用程序将数据保存在 FileStream 中,按需更改其大小。这最终会导致文件碎片化。我想监控文件的碎片状态,并在此基础上决定是否应该复制文件并将其替换为新文件(从而在不更改 MFT 的情况下对其进行“碎片整理”)。

【问题讨论】:

  • 在 Linux 上,这可以通过filefrag 使用的系统调用ioctl(FIEMAP) 来实现。大多数磁盘文件系统都支持,但不支持 NFS。

标签: .net filesystems low-level fragmentation defragmentation


【解决方案1】:

这完全属于“过早优化”类别。完全不能保证您会导致碎片,光盘很可能在文件末尾有未提交的簇并且经常这样做。也许更重要的是,.NET 框架中没有任何东西可以让您检测或修复这个问题。访问卷的 MFT 需要非托管代码和管理员权限。

对磁盘进行碎片整理是一项正常的机器维护任务。它在 Win7 中变得自动。

【讨论】:

  • @nobugz,感谢您的 POV,但请允许我解释一下: 1. 当经常增加 FileStream 的大小时,往往会导致碎片(根据我的经验,另请参阅 stackoverflow.com/questions/917309/…) . 2. 创建一个特定大小的新流并将原始流复制到其中往往会克服碎片,因为新文件分配有一系列漂亮的簇,所以我确实有办法“修复”这个问题。跨度>
  • 3.我不是假设碎片,我假设它是可能的,我正在寻找一种在运行时否定或验证我的怀疑的方法。 4. 我可以采用非常丑陋的方式来激活碎片整理分析并检查日志文件......但这真的很丑陋。 5. 我可以肯定地告诉你,我的客户不会对他们的磁盘进行碎片整理,而且大多数人仍然使用 WinXP。 @Mark Ransom,我很想买一个 SSD,我很想为我的每个客户买一个。也许十年后,文件碎片化将会过时。同时……
  • @nobugz,最后,你可能是对的,这可能是过早的优化。不过,我很想得到问题本身的答案(不管动机)
  • 我建议你问一个不同的问题:“如何检测 Windows 中的碎片程度”,更不用说托管代码了。
猜你喜欢
  • 2016-03-29
  • 2012-09-26
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多