Delphi 确定具有硬链接的目录中使用的实际大小

Delphi 确定具有硬链接的目录中使用的实际大小,delphi,Delphi,我最近一直在玩一个程序的硬链接,该程序将文件复制到其目录中的所有位置,删除所有重复的文件,并用硬链接替换它们。我记下来了,好的。我理解硬链接的工作方式,它只是对磁盘上数据本身的另一种引用。因此,如果我从一个创建的硬链接访问数据,它看起来是一样的 问题是找到实际使用的磁盘空间量,这是验证这是否确实节省空间的问题之一。换句话说,如果一个文件以12K文件开始,创建该文件的硬链接,然后在资源管理器中选择两者,它将显示为磁盘上使用的24K,而不是真正应该的12K 我知道我可以在进程前后查询磁盘上的可用空间

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

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

我知道我可以在进程前后查询磁盘上的可用空间,然后进行比较。但这只是初步评估,事后很难核实。我也知道,我可以使用它来确定所讨论的文件是否有多个引用


有什么想法吗?我是否必须为每个文件调用GetFileInformationByHandle,记录所有数据,然后删除具有重复索引引用的文件,以获得实际使用的磁盘空间的准确视图?还是有更简单的方法来实现这一点?

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

不幸的是,这意味着您必须打开每个文件。链接计数未保存在目录信息中,因此
FindFirstFile
无法将其提供给您。您需要
GetFileInformationByHandle
,这需要一个句柄

你可能希望阅读;除了可以应用于您的应用程序的硬链接之外,它还提到了其他几个关键案例,包括重分析点、集群舍入和备用数据流


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

请准确执行此操作。维护一组(dwVolumeSerialNumber、nFileIndexHigh、nFileIndexLow)三元组。每次你遇到一个文件时,检查你以前是否见过它(例如,它的三元组是否已经在你的集合中)。如果是,那么跳过它。如果没有,则将其文件大小添加到总数中,并将其信息插入集合中

不幸的是,这意味着您必须打开每个文件。链接计数未保存在目录信息中,因此
FindFirstFile
无法将其提供给您。您需要
GetFileInformationByHandle
,这需要一个句柄

你可能希望阅读;除了可以应用于您的应用程序的硬链接之外,它还提到了其他几个关键案例,包括重分析点、集群舍入和备用数据流


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

仅确定一个文件具有多个引用的事实是不够的。之后,您还需要知道是否有任何其他现有链接属于当前正在计算其大小的同一目录或目录树。或者,换句话说,如果相关目录(或目录树)中的任何两个或多个硬链接指向同一实体。此任务的非平凡性可能是Windows资源管理器在显示总大小时不考虑硬链接的原因。您无需验证硬链接是否节省空间。仅仅证明一个文件有多个引用是不够的。之后,您还需要知道是否有任何其他现有链接属于当前正在计算其大小的同一目录或目录树。或者,换句话说,如果相关目录(或目录树)中的任何两个或多个硬链接指向同一实体。此任务的非平凡性可能是Windows资源管理器在显示总大小时不考虑硬链接的原因。您无需验证硬链接是否节省空间。是的。