【问题标题】:c# file path string comparison case insensitivityc#文件路径字符串比较大小写不敏感
【发布时间】:2014-10-07 07:41:56
【问题描述】:

我想在 c# 中比较两个包含文件路径的字符串。

但是,由于在 ntfs 中默认使用不区分大小写的路径,我希望字符串比较以同样的方式不区分大小写。

但是,我似乎找不到任何有关 ntfs 如何实际实现其不区分大小写的信息。我想知道的是如何使用 ntfs 用于文件路径的相同大小写规则对字符串进行不区分大小写的比较。

【问题讨论】:

  • 如果您真的只是想进行字符串比较,以下答案可能有效。但是,只有字符串比较不会告诉您两个文件路径是否引用同一个实际文件对象。有关可以正确告诉您两个文件路径是否引用同一文件的 c# 函数,请参阅stackoverflow.com/a/39399232/1082063

标签: c# string ntfs case-insensitive casing


【解决方案1】:

来自MSDN

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

还有:

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

所以很简单:

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

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

【讨论】:

  • 谢谢!这正是我想要的。
  • 我意识到这个问题只是问了如何以不区分大小写的方式比较两个文件名,但有人可能会猜测这种比较的目的是尝试确定两个文件名是否引用同一个对象。如果您要确定两个文件名是否引用同一个文件,这将无法解决问题。应该指出的是,要确定两个文件名是否引用同一个文件对象是非常困难的,因为可能存在连接、链接、网络共享等。请参阅stackoverflow.com/a/39399232/1082063
【解决方案2】:

在比较路径的同时,路径的分隔方向也很重要。例如:

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

【讨论】:

    【解决方案3】:
    string path1 = "C:\\TEST";
    string path2 = "c:\\test";
    
    if(path1.ToLower() == path2.ToLower())
        MessageBox.Show("True");
    

    你是说这个还是我没听懂?

    【讨论】:

    • 虽然这确实适用于英文字符,但我仍然不知道 windows 实际如何处理国际字符。那是我的问题。如果是这种情况,最好使用 String.Compare(string,string,StringComparison) ,因为它不会实例化两个新字符串。我想确保字符串比较使用与 ntfs 相同的大小写规则。
    • hm 我很确定 tolower 和 strongcomparison 都适用于任何文化,因为如果该语言中存在小写,他们会尝试将其转换为小写。复制粘贴一些外国排版到字符串中,然后用这种方式测试
    • 我知道它有效,但你误解了这个问题。我已经知道如何进行不区分大小写的搜索。我问的是我应该使用哪种不区分大小写的规则。上面已经回答了这个问题。
    【解决方案4】:

    我会去

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

    或者如果您想指定文化:

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

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

    【讨论】:

    • 我知道如何不区分大小写地比较两个字符串。我想确定的是,不区分大小写使用与 NTFS 相同的大小写规则。 ntfs 是否使用当前的文化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多