使用.Net验证路径相等性

39 .net c# path

比较.Net中的两个路径以确定它们是否指向同一文件或目录的最佳方法是什么?

  1. 如何验证这些是否相同:

    c:\Some Dir\SOME FILE.XXX
    C:\\\SOME DIR\some file.xxx
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更好的是:有没有办法验证这些路径指向某个网络驱动器上的同一文件:

    h:\Some File.xxx
    \\Some Host\Some Share\Some File.xxx
    
    Run Code Online (Sandbox Code Playgroud)

更新:

Kent Boogaart正确回答了我的第一个问题; 但我仍然很想知道我的第二个问题是否有关于比较网络驱动器上的文件和目录路径的解决方案.

更新2(我的两个问题的综合答案):

问题1:本地和/或网络文件和目录

c:\Some Dir\SOME FILE.XXX
C:\\\SOME DIR\some file.xxx
Run Code Online (Sandbox Code Playgroud)

答案:System.IO.Path.GetFullPath例如:

var path1 = Path.GetFullPath(@"c:\Some Dir\SOME FILE.XXX");
var path2 = Path.GetFullPath(@"C:\\\SOME DIR\subdir\..\some file.xxx");

// outputs true
Console.WriteLine("{0} == {1} ? {2}", path1, path2, string.Equals(path1, path2, StringComparison.OrdinalIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

问题2:本地和/或网络文件和目录

答案:使用http://briancaos.wordpress.com/2009/03/05/get-local-path-from-unc-path/上发布的GetPath方法

Ken*_*art 41

var path1 = Path.GetFullPath(@"c:\Some Dir\SOME FILE.XXX");
var path2 = Path.GetFullPath(@"C:\\\SOME DIR\subdir\..\some file.xxx");

// outputs true
Console.WriteLine("{0} == {1} ? {2}", path1, path2, string.Equals(path1, path2, StringComparison.OrdinalIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

忽略大小写只是Windows上的一个好主意.您可以FileInfo.FullName以类似的方式使用,但可以使用Path文件和目录.

不确定你的第二个例子.

  • `Path.GetFullPath(@“ C:\ src”)`返回`@“ C:\ src”`,`Path.GetFullPath(@“ C:\ src \”)`返回`@“ C:\ src \” `。换句话说,即使这些路径是等效的,上面概述的方法在这种极端情况下也将失败。 (3认同)
  • @srm,因为文件路径是文化上独立的数据。请参阅 https://learn.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings#choosing-a-stringcomparison-member-for-your-method-call (3认同)
  • 为什么`new FileInfo(@"c:\").Equals(new FileInfo(@"c:\"))`评估为`false`?这真的应该是这样做的方式.. (2认同)
  • 比较目录时,您应该考虑尾部斜杠。例如,`@"A:\dir"` 不等于 `@"A:\dir\"` 和 `GetFullPath`。 (2认同)
  • 为什么这个答案使用 OrdinalIgnoreCase 而不是 CurrentCultureIgnoreCase?这些文件名字符串来自用户。在我看来,这意味着您需要使用当前的文化进行正确比较。Ordinal 仅对机器生成的字符串有效,例如解析已知模式中的 XML 标签。我是不是误解了什么? (2认同)

Har*_*dik 7

虽然这是一个旧帖子,因为我发现了一个.

使用Path.GetFullpath我可以解决我的问题,例如.

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))
Run Code Online (Sandbox Code Playgroud)

  • 这在返回`false`的情况下不起作用:`Path.GetFullPath(@"C:\tfs\").Equals(Path.GetFullPath(@"C:\TFS"))` (6认同)