【问题标题】:How do I determine whether two file system URI's point to the same resource?如何确定两个文件系统 URI 是否指向同一个资源?
【发布时间】:2009-05-12 11:28:25
【问题描述】:

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

这可能是这种情况,例如,如果用户连接了一个指向某个网络资源的网络驱动器。例如驱动器 S:映射到 \servercrm\SomeFolder。

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

S:\somefile.dat

\\servercrm\SomeFolder\somefile.dat

我怎样才能检测到这一点?我需要对其进行编码,使其适用于路径可能以不同方式指向同一文件的所有场景。

【问题讨论】:

    标签: c# .net io


    【解决方案1】:

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

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

    ...

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

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

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

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


    编辑添加:

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

    【讨论】:

    • 谢谢,这似乎可以满足我的需求。我会调查的。
    【解决方案2】:

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

    【讨论】:

    • 我想到了这个,但是生成MD5哈希对我的应用程序来说需要很长时间,因为我需要通过网络读取文件。
    • 这只会告诉您它们很可能具有相同的内容,而不是它们是 same 文件。它可能是文件的副本,作为一种可能会失败的场景。
    • 埃里希:你基本上是对的。但是,您的硬盘上有多少文件具有相同的名称、MD5 哈希、AND CreationTime、LastAccessTime 和 LastWriteTime?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2013-03-17
      • 2013-03-20
      • 1970-01-01
      • 2014-07-13
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多