2014-10-07 192 views
4

我想比较两个包含c#文件路径的字符串。c#文件路径字符串比较不区分大小写

但是,由于在NTFS默认情况下是使用大小写不敏感的路径,所以我希望字符串比较以同样的方式不区分大小写。

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

回答

7

MSDN

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

和:

在解释文件名,饼干,或任何其他地方,如组合“A”可以出现,依次比较仍然提供了最透明的和恰当的行为。

因此它只是:

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

(我总是用静态Equals通话的情况下,左操作null

+0

谢谢!这正是我所期待的。 – 2014-10-07 07:57:35

+0

我意识到这个问题,简单地问如何以不区分大小写的方式比较两个文件名,但可以猜测这种比较的目的是试图确定两个文件名是否引用同一个对象。如果你正在寻找确定两个文件名是否涉及同一个文件,这不会有诀窍。应该指出的是,鉴于连接,链接,网络上的共享等的可能性,确定两个文件名是否指向相同的文件对象是非常困难的。参见http://stackoverflow.com/a/39399232/ 1082063。 – 2016-10-12 03:27:23

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

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

你的意思是这还是我没有得到题?

+0

虽然这对英文字符确实很好,但我仍然不知道windows如何处理国际字符。这是我的问题。如果是这种情况,最好使用String.Compare(string,string,StringComparison),因为它不会实例化两个新字符串。我想确保字符串比较使用与ntfs相同的外壳规则。 – 2014-10-07 07:54:22

+0

嗯,我很确定tolower和strongcomparison都适用于任何文化,因为如果小语种存在于这种语言中,他们会试图将其置于小写。复制粘贴一些外国的排版到字符串中,然后用这种方式测试 – Vajura 2014-10-07 08:41:25

+0

我知道它有效,但你误解了这个问题。我已经知道如何做一个不区分大小写的搜索。我问的是我应该使用哪些不区分大小写规则。这个问题已经在上面回答了。 – 2014-10-07 08:43:38

0

我会去

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

,或者如果要指定文化:使用ToUpper的没有无用的内存分配你比较每次

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

东西

+1

我知道如何比较两个字符串不区分大小写。我想确定的是不区分大小写使用与NTFS相同的外壳规则。 ntfs是否使用当前的文化? – 2014-10-07 07:55:20

0

虽然路径比较路径的分隔符方向也非常重要。例如:

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

isEqualfalse

因此首先需要解决的路径:

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); 
相关问题