如何确定两个文件系统URI是否指向同一资源?

3

如果我有两个不同的文件路径,如何确定它们是否指向同一个文件?

这种情况可能会出现,例如用户连接了网络驱动器,该驱动器指向某些网络资源。例如,将驱动器S:映射到\servercrm\SomeFolder。

那么这些路径实际上指向同一个文件:

S:\somefile.dat

并且
\\servercrm\SomeFolder\somefile.dat

我该如何检测这个问题?我需要编写代码,使其在可能存在多种指向同一文件的路径的所有情况下都能正常工作。

3个回答

3
我不知道是否有一种简单的方法可以直接在C#中完成此操作,但您可以调用未管理的方法GetFileInformationByHandle(pinvoke页面在这里),它将返回一个BY_HANDLE_FILE_INFORMATION结构。其中包含三个字段,可以组合成唯一标识文件:

dwVolumeSerialNumber: 包含文件的卷序列号。

...

nFileIndexHigh: 与文件关联的唯一标识符的高位部分。

nFileIndexLo: 与文件关联的唯一标识符的低位部分。

标识符(低位和高位部分)和卷序列号唯一地标识单台计算机上的文件。要确定两个打开的句柄是否表示相同的文件,请结合每个文件的标识符和卷序列号并进行比较。

请注意,这仅适用于两个引用都是从同一台计算机声明的情况。


编辑以添加:

根据此问题,如果共享定义不同,则可能无法解决您的情况,因为dwVolumeSerialNumber可能会有所不同。不过我建议先尝试一下,因为我一直认为卷序列号是特定于驱动器而不是特定于路径的。不过我从未需要证明这一点,所以我可能是(并且很可能是)错误的。


谢谢,这似乎可以满足我的需求。我会调查一下的。 - driis

1

至少你可以获取并比较合并文件内容、文件名和元数据(如CreationTime、LastAccessTime和LastWriteTime)的MD5哈希值。


我考虑过这个,但是生成MD5哈希值会花费太长时间,因为我需要通过网络读取文件。 - driis
这只会告诉你它们很可能具有相同的内容,而不是它们是相同的文件。这可能是文件的副本,这是一种会导致失败的情况。 - Erich Mirabal
Erich:你说得大部分正确。但是,你的硬盘上有多少个文件拥有相同的名称、MD5哈希值、创建时间、最近访问时间和最后写入时间呢? - Robert Venables

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接