C#文件路径字符串比较不区分大小写

4
我想比较两个包含文件路径的字符串,使用c#语言。
然而,在ntfs中,默认使用大小写不敏感的路径,因此我希望字符串比较也是以同样的方式进行大小写不敏感。
然而,我似乎找不到任何有关ntfs如何实现其大小写不敏感性的信息。我想知道如何使用与ntfs文件路径相同的大小写规则执行字符串的大小写不敏感比较。

如果您只是想进行字符串比较,下面的答案可能适用。然而,仅仅进行字符串比较并不能告诉您两个文件路径是否引用同一个实际的文件对象。如果您需要一个能够正确判断两个文件路径是否引用同一文件的C#函数,请参见https://dev59.com/73E95IYBdhLWcg3whOHK#39399232。 - David I. McIntosh
4个回答

8

根据MSDN的说明:

文件系统、注册表键值和环境变量的字符串行为最好用StringComparison.OrdinalIgnoreCase表示。

并且:

当解释文件名、cookie或任何其他可能出现类似“å”的组合时,序数比较仍然提供最透明和适合的行为。

因此,简单地说:

String.Equals(fileNameA, fileNameB, StringComparison.OrdinalIgnoreCase)

(如果左操作数为null,我总是使用静态的Equals调用)

谢谢!这正是我寻找的。 - Cedric Mamo
我意识到问题只是简单地询问如何以不区分大小写的方式比较两个文件名,但人们可能会猜测这样比较的目的是为了确定两个文件名是否指向同一个对象。如果您想确定两个文件名是否指向同一个文件,则这种方法行不通。应该指出,鉴于联接、链接、网络共享等可能性,确定两个文件名是否指向同一个文件对象非常困难。请参见https://dev59.com/73E95IYBdhLWcg3whOHK#39399232。 - David I. McIntosh

1

在比较路径时,路径分隔符的方向也非常重要。例如:

 bool isEqual = String.Equals("myFolder\myFile.xaml", "myFolder/myFile.xaml", StringComparison.OrdinalIgnoreCase);

isEqual 将会是 false

因此需要先修复路径:

 private string FixPath(string path)
    {
        return path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
                   .ToUpperInvariant();
    }

"

而这个表达式将会是true

"
bool isEqual = String.Equals(FixPath("myFolder\myFile.xaml"), FixPath("myFolder/myFile.xaml"), StringComparison.OrdinalIgnoreCase);

0
string path1 = "C:\\TEST";
string path2 = "c:\\test";

if(path1.ToLower() == path2.ToLower())
    MessageBox.Show("True");

你是指这个还是我没有理解问题?


虽然这对英文字符来说效果很好,但我仍然不知道Windows如何处理国际字符。这是我的问题所在。如果是这种情况,最好使用String.Compare(string,string,StringComparison),因为它不会实例化两个新字符串。我想确保字符串比较使用与NTFS相同的大小写规则。 - Cedric Mamo
嗯,我非常确定tolower和strongcomparison都适用于任何文化,因为它们会尝试将其转换为小写字母(如果该语言中存在小写字母)。将一些外国类型集粘贴到字符串中并进行测试。 - Vajura
我知道它可以工作,但你误解了问题。我已经知道如何进行不区分大小写的搜索。我的问题是应该使用哪些不区分大小写规则。这个问题在上面已经得到了回答。 - Cedric Mamo

0

我会选择

string.Compare(path1, path2, true) == 0

或者如果您想指定文化:

string.Compare(path1, path2, true, CultureInfo.CurrentCulture) == 0 

使用 ToUpper 每次比较时都会进行无用的内存分配


1
我知道如何不区分大小写地比较两个字符串。我想要确定的是,这种不区分大小写使用与NTFS相同的大小写规则。NTFS是否使用当前文化? - Cedric Mamo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接