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

时间:2009-05-12 11:28:25

标签: c# .net io

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

例如,如果用户连接了网络驱动器,则指向某些网络资源。例如,驱动器S:映射到\ servercrm \ SomeFolder。

然后这些路径实际上指向同一个文件:

S:\somefile.dat

\\servercrm\SomeFolder\somefile.dat

我怎样才能发现这个?我需要对其进行编码,以便它可以在所有可能有不同方式指向同一文件的方案中工作。

3 个答案:

答案 0 :(得分:3)

我不知道是否有一种简单的方法可以直接在C#中执行此操作,但您可以对GetFileInformationByHandle(pinvoke页面here)进行非托管调用,该调用将返回{{3} } 结构体。这包含三个字段,可以组合以唯一地标识文件:

  

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

     

...

     

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

     

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

     

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

请注意,这仅在两个引用都是从同一台机器声明时才有效。


编辑添加:

根据BY_HANDLE_FILE_INFORMATION,这可能不适用于您所拥有的情况,因为dwVolumeSerialNumber可能不同,因此共享定义不同。我首先尝试一下,因为我一直认为卷序列号是特定于驱动器的,而不是路径特定的。我从来不需要真正证明这一点,所以我可能(可能是)错了。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果您只担心本地文件,那么您可以使用GetFileInformationByHandle和BY_HANDLE_FILE_INFORMATION结构的组合。 Lucian在这里做了一篇关于这个主题的精彩博文。代码在VB.Net中,但它应该可以轻松转换为C#

相关问题