比较路径并忽略驱动器号的大小写

Compare paths & ignoring case of drive letter

我正在检查注册表中的 2 个程序配置文件路径。有时一个存储为小写 c,另一个存储为大写 C,这样就无法进行简单的字符串比较。

我想完成的基本上就是

"C:\MyPath\MyConfig.json" == "c:\MyPath\MyConfig.json"

但是

"C:\MyPath\myconfig.json" != "C:\MyPath\MyConfig.json"

//编辑:我刚刚注意到 windows 根本不区分大小写,因此甚至不需要后面的代码块。抱歉,我应该首先检查一下,但我一直认为 windows 在路径中区分大小写,但看起来确实不是。

是否有类似 Path.Compare(p1, p2) 的东西,或者是手动执行此操作的唯一方法?

您可以使用String.Equals()来比较两个路径(字符串)。

以下returnstrue:

var equal = String.Equals(@"C:\MyPath\MyConfig.json", @"c:\MyPath\MyConfig.json", StringComparison.OrdinalIgnoreCase); //or StringComparison.InvariantCultureIgnoreCase

更新(问题更新后)

您应该比较字符串的根部和其余部分:

var path1 = @"C:\MyPath\MyConfig.json";
var path2 = @"c:\MyPath\myConfig.json";
    
var rootEqual = String.Equals(Path.GetPathRoot(path1), Path.GetPathRoot(path2), StringComparison.OrdinalIgnoreCase); // true

var withoutRootEqual = String.Equals(path1.Substring(Path.GetPathRoot(path1).Length), path2.Substring(Path.GetPathRoot(path2).Length)); //false

var equal = rootEqual && withoutRootEqual;

使用这种方法的结果是:

"C:\MyPath\MyConfig.json" && "C:\MyPath\MyConfig.json" -> true
"C:\MyPath\MyConfig.json" && "c:\MyPath\MyConfig.json" -> true
"C:\MyPath\MyConfig.json" && "C:\MyPath\myConfig.json" -> false
"C:\MyPath\MyConfig.json" && "c:\MyPath\myConfig.json" -> false

注意:这仅适用于 Windows,因为 Linux 中的根不同,但可以通过类似的方式获得所需的结果。