一尘不染

如何在C#中比较(目录)路径?

c#

如果我有两个DirectoryInfo对象,如何比较它们的语义相等性?例如,以下路径应全部视为等于C:\temp

  • C:\temp
  • C:\temp\
  • C:\temp\.
  • C:\temp\x\..\..\temp\.

以下内容可能等于也可能不等于C:\temp

  • \temp 如果当前工作目录在驱动器上 C:\
  • temp 如果当前工作目录是 C:\
  • C:\temp.
  • C:\temp...\

如果考虑当前的工作目录很重要,那么我可以自己弄清楚,所以这并不重要。尾随的点在窗口中被剥离,因此这些路径确实应该相等-
但它们在unix中不被剥离,因此在mono下,我期望其他结果。

区分大小写是可选的。这些路径可能存在或不存在,并且用户可能具有该路径的权限-我更喜欢一种快速健壮的方法,该方法不需要任何I /
O(因此无需权限检查),但是如果有内置的东西-我也会对“足够好”的东西感到满意…


阅读 496

收藏
2020-05-19

共1个答案

一尘不染

这个答案中,该方法可以处理一些边缘情况:

public static string NormalizePath(string path)
{
    return Path.GetFullPath(new Uri(path).LocalPath)
               .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
               .ToUpperInvariant();
}

原始答案中有更多详细信息。像这样称呼它:

bool pathsEqual = NormalizePath(path1) == NormalizePath(path2);

应该同时适用于文件和目录路径。

2020-05-19