【发布时间】:2019-12-30 13:57:21
【问题描述】:
我为System.IO.FileInfo 类编写了一个扩展方法来创建硬链接,它是这样的:
[DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
private static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);
public static void CreateHardLink(this FileInfo file, string destination) {
CreateHardLink(destination, file.FullName, IntPtr.Zero);
}
// Usage:
fileInfo.CreateHardLink(@".\hardLinkCopy.txt");
该方法工作正常,但我想做一些单元测试只是为了它。那么如何断言一个文件 x 和另一个文件 y 链接到相同的数据呢?
我想出了一些方法来测试它:
- 检查数据在整个更改过程中是否一致 由于创建硬链接副本只是为文件提供第二个名称,因此对第一个实例所做的任何修改都将反映在第二个实例上,反之亦然.如果尽管修改了两个文件之间的数据保持一致,则可以安全地假设这些文件都硬链接到相同的数据。
- 断言硬链接的创建不会影响父文件夹的大小。 由于硬链接副本不会复制磁盘上的任何数据,因此父目录不应变得更重。如果在调用该方法时创建了一个与原始文件具有相同内容的新文件,并且父文件夹的大小没有改变(或增益小于正常副本的大小),则新文件必须是硬文件链接副本。
但是,这些方法有异味。操作系统中必须至少有一个内置方法来检查两个文件是否指向磁盘上的相同数据!
任何人都可以分享线索吗?
【问题讨论】:
-
您可能能够获得类似文件 ID 的“inode”并检查它是否等效。请参阅 Does Windows have Inode Number 上的 asveikau 的回答。显然这也可以通过command line进行检查。
标签: c# unit-testing hardlink