1

我最近在一个程序上玩硬链接,该程序将文件复制到其目录中的所有位置,删除所有重复项并用硬链接替换它们。我把它记下来了。我了解硬链接的工作方式只是对磁盘上数据本身的另一种引用。因此,如果我要从创建的硬链接访问数据,它看起来是一样的。

问题是找到实际使用的磁盘空间量,这是验证这确实是节省空间的问题之一。换句话说,如果要从 12K 文件开始,创建该文件的硬链接,然后在资源管理器中选择两者,它会显示为 24K 在磁盘上使用,而不是真正应该的 12K。

我知道我可以在进程之前和之后查询磁盘上的可用空间,然后进行比较。但这是初步评估,事后很难验证。我也知道我可以使用GetFileInformationByHandle来查明相关文件是否有多个引用。

那么这里有什么想法吗?我是否必须为每个文件调用 GetFileInformationByHandle,记录所有数据,然后删除具有重复索引引用的文件才能准确了解实际使用了多少磁盘空间?或者有没有更简单的方法来实现这一点?

4

1 回答 1

1

做到这一点。维护一组 (dwVolumeSerialNumber, nFileIndexHigh, nFileIndexLow) 三元组。每次遇到文件时,请检查您以前是否看过它(即,它的三元组是否已经在您的集合中)。如果是这样,那就跳过它。如果没有,则将其文件大小添加到您的总数中,并将其信息插入集合中。

不幸的是,这意味着您必须打开每个文件。链接数没有保存在目录信息中,所以FindFirstFile不能给你。你需要GetFileInformationByHandle,这需要一个句柄。

您可能希望阅读Raymond Chen 关于该主题的文章;除了可以应用于您的应用程序的硬链接之外,它还提到了其他几个极端情况,包括重解析点、聚类舍入和备用数据流。

您可以尝试通过仅跟踪链接计数大于 1 的文件来减少维护集合所需的工作量。只有一个链接的文件不应在目录遍历中多次出现。假设您只会看到每个目录一次。重新解析点和连接点会使假设无效,因此如果您尝试减小“已查看文件”集的大小,您还需要跟踪已查看的目录。

于 2012-04-30T15:49:27.943 回答