如果我有两个不同的文件路径,如何确定它们是否指向同一个文件?
这种情况可能会出现,例如用户连接了网络驱动器,该驱动器指向某些网络资源。例如,将驱动器S:映射到\servercrm\SomeFolder。
那么这些路径实际上指向同一个文件:
S:\somefile.dat
并且
\\servercrm\SomeFolder\somefile.dat
我该如何检测这个问题?我需要编写代码,使其在可能存在多种指向同一文件的路径的所有情况下都能正常工作。
dwVolumeSerialNumber: 包含文件的卷序列号。
...
nFileIndexHigh: 与文件关联的唯一标识符的高位部分。
nFileIndexLo: 与文件关联的唯一标识符的低位部分。
标识符(低位和高位部分)和卷序列号唯一地标识单台计算机上的文件。要确定两个打开的句柄是否表示相同的文件,请结合每个文件的标识符和卷序列号并进行比较。
请注意,这仅适用于两个引用都是从同一台计算机声明的情况。
编辑以添加:
根据此问题,如果共享定义不同,则可能无法解决您的情况,因为dwVolumeSerialNumber可能会有所不同。不过我建议先尝试一下,因为我一直认为卷序列号是特定于驱动器而不是特定于路径的。不过我从未需要证明这一点,所以我可能是(并且很可能是)错误的。
至少你可以获取并比较合并文件内容、文件名和元数据(如CreationTime、LastAccessTime和LastWriteTime)的MD5哈希值。
如果您只关心本地文件,则可以使用GetFileInformationByHandle和BY_HANDLE_FILE_INFORMATION
结构的组合。Lucian在这里对此主题进行了出色的博客文章。代码是用VB.Net编写的,但应该很容易转换为C#。