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

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

以下各项可能等于或不等于C:\temp:

  • \temp如果当前工作目录位于驱动器C:\
  • 如果当前工作目录为C:\,则为temp
  • C:\temp.
  • C:\temp...\

如果考虑当前工作目录很重要,我可以自己弄清楚,所以这并不重要.在windows中,尾部的圆点会被剥离,所以这些路径应该是相等的--但在unix中它们不会被剥离,所以在mono下,我会期待其他的结果.

区分大小写是可选的.路径may or may not exist和用户may or may not have permissions to the path-我更喜欢不需要任何I/O(所以不需要权限判断)的快速健壮的方法,但是如果有内置的东西,我也会对任何"足够好"的东西感到满意……

我意识到,如果没有I/O,就不可能确定某个中间存储层是否恰好将相同的存储映射到了相同的文件(即使有I/O,当事情变得足够混乱时,也很可能是不可能的).然而,应该至少可以肯定地标识等价的路径,而不考虑底层文件系统,即必须解析到给定类型的所有可能的文件系统上的相同文件(如果存在)的路径.这有时很有用的原因是(A)因为我肯定希望在执行I/O之前首先判断这一点,(B)I/O有时会触发有问题的副作用,(C)各种其他软件组件有时会 destruct 所提供的路径,能够以对等效路径的最常见转换不敏感的方式进行比较是有帮助的,最后(D)为了准备部署,事先执行一些健全性判断是有用的,但这些判断发生在要部署的系统甚至可以访问之前.

推荐答案

this answer开始,此方法可以处理一些边缘情况:

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);

应该适用于文件和目录路径.

.net相关问答推荐

从Couchbase删除_txn文档的推荐方法?""

.NET最小API BadRequest响应不返回正文

.NET MAUI ListView - ObservableCollection - 在异步方法期间不更新

IIS 发布 ASP.NET Core 应用程序而不关闭 IIS 网站

MassTransit RespondAsync 无法返回空值

如何在 Windows 窗体上显示 ClickOnce 版本号

string.Format 如何处理空值?

将客户端证书添加到 .NET Core HttpClient

不同命名空间中的部分类

mstest.exe 在哪里?

在 .NET C# 中存储加密密钥的最佳方式

如何使用c#从excel文件中读取数据

图像与位图类

寻找 .NET 的命令行参数解析器

自定义属性的构造函数何时运行?

如何在 C# 中以编程方式安装 Windows 服务?

是否可以在 XP 上运行 .NET 4.5 应用程序?

我应该如何删除 DbSet 中的所有元素?

将月份 int 转换为月份名称

将控制台输出镜像到文件