如果我有两个不同的文件路径,如何确定它们是否指向同一个文件?
例如,如果用户连接了网络驱动器,则指向某些网络资源。例如,驱动器S:映射到\ servercrm \ SomeFolder。
然后这些路径实际上指向同一个文件:
S:\somefile.dat
和
\\servercrm\SomeFolder\somefile.dat
我怎样才能发现这个?我需要对其进行编码,以便它可以在所有可能有不同方式指向同一文件的方案中工作。
答案 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#