.NET如何比较两个表示文件名的字符串,正确地忽略大小写

时间:2009-11-18 15:19:47

标签: c# filesystems culture case-insensitive

鉴于(至少在NTFS上)Windows上的文件系统不区分大小写,我想将String fileAString fileB进行比较:

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)

那么问题就变成我应该使用哪种文化,默认的当前(ui?)文化是否足够?我似乎无法为此目的找到任何BCL方法。

6 个答案:

答案 0 :(得分:25)

您应该使用StringComparison.OrdinalIgnoreCase,详见Best Practices for Using Strings in the .NET Framework(搜索“文件路径”以查找相关部分)。

如果您使用文化来匹配字符串,您可能会参与其中,例如名称“häl.gif”和“hal.gif”将被视为匹配。

答案 1 :(得分:1)

马库斯,

您可能希望查看另一个StackOverflow问题的答案,该问题非常相似:Win32 File Name Comparison,后者提到http://www.siao2.com/2005/10/17/481600.aspx

在对同一问题的另一个答案中进行了链接并进一步挖掘之后,我遇到了以下MSDN文章http://msdn.microsoft.com/en-us/library/ms973919.aspx。一般来说值得一读,但在文件名比较时,建议使用StringComparison.OrdinalIgnoreCase。请参阅本文中的表1,其中包含文件路径作为处理的数据类型之一或以下引用:

因此,当解释文件名,cookie或其他类似å组合的东西时,顺序比较仍然提供最透明和最合适的行为。

希望这有帮助, 波阿斯

答案 2 :(得分:1)

这是不可能做到的。

是的,文件系统的大小写转换不区分大小写。

但是案例转换表存储在文件系统本身(对于NTFS),它确实在版本之间发生了变化(例如Vista案例转换表被带到了Unicode 5级别,因此Vista NTFS和XP NTFS有所不同案件转换规则)。

重要的是格式化文件系统的操作系统,而不是当前的操作系统。

然后你可以遇到其他文件系统的所有问题(Mac OS做某种Unicode规范化(不是标准的)),Linux什么都不做,但是Samba(实现Windows文件共享协议)呢。还有其他表格而不是Windows。

如果我将一封信映射到Linux或Mac OS共享的网络磁盘,会发生什么?

通常,您不应该尝试比较文件名。如果您想知道它是否存在,请尝试访问它。

答案 3 :(得分:0)

答案 4 :(得分:0)

您可以使用InvariantCulture(查看 http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx)。

在你的例子中:


FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )

答案 5 :(得分:0)

我试过了。

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))