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

19

考虑到(至少在NTFS上)Windows上的文件系统不区分大小写,我想要将 String fileAString fileB 进行如下比较:

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)

那么问题就变成我应该使用哪个语言文化,当前(UI?)语言文化是否足够?我似乎找不到任何用于此目的的基类库方法。


为此目的,我总是建议使用CultureInfo.InvariantCulture。 - Joachim Kerschbaumer
6个回答

28

根据.NET框架中使用字符串的最佳实践,您应该使用StringComparison.OrdinalIgnoreCase

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

如果您使用一种文化来匹配字符串,则可能会出现这样的情况,例如名称"häl.gif"和"hal.gif"将被视为匹配。


2
它确实回答了这个问题。不应使用任何文化。NTFS文件名比较是序数比较。 - Pavel Minaev
1
我尝试在MSDN上找到支持这一点的官方声明,但没有找到。如果有人找到了,请提供链接。 - Roman Starkov

3

这是不可靠的操作。

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

但是大小写转换表存储在文件系统本身上(对于NTFS),而且在不同版本之间会发生变化(例如Vista将大小写转换表提升到了Unicode 5级别,因此Vista NTFS和XP NTFS具有不同的大小写转换规则)。

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

然后,您可能会遇到其他文件系统的各种问题(Mac OS执行某种Unicode标准化(不是标准的那个),Linux什么都不做,但Samba(实现Windows文件共享协议)会执行其他不同于Windows的表格)。

那么如果我映射一个字母到由Linux或Mac OS共享的网络磁盘会发生什么?

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


2

Marcus,

你可能想要查看另一个StackOverflow问题的答案,它非常相似:Win32文件名比较,该问题又提到了http://www.siao2.com/2005/10/17/481600.aspx

在阅读同一问题的另一个答案中的链接并深入挖掘后,我发现了以下MSDN文章:http://msdn.microsoft.com/en-us/library/ms973919.aspx。它通常值得一读,但是当涉及文件名比较时,它推荐使用StringComparison.OrdinalIgnoreCase。请参见文章中包含文件路径作为处理数据类型之一的表1或以下引用:

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

希望有所帮助, Boaz


0

3
不要这样做,这与NTFS规则不一致。请使用序数比较。 - Pavel Minaev

0

2
它使用当前文化,因此与他已经拥有的相同。 - Guffa
是的,抱歉,我稍后才发现这个问题。 - kubal5003

-1

我尝试过了。

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

1
更好的方法是 Path.GetFullPath(path1).TrimEnd(Path.DirectorySeparatorChar).Equals(Path.GetFullPath(path2).TrimEnd(Path.DirectorySeparatorChar)) - SensorSmith

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