考虑到(至少在NTFS上)Windows上的文件系统不区分大小写,我想要将 String fileA
和 String fileB
进行如下比较:
fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)
那么问题就变成我应该使用哪个语言文化,当前(UI?)语言文化是否足够?我似乎找不到任何用于此目的的基类库方法。
考虑到(至少在NTFS上)Windows上的文件系统不区分大小写,我想要将 String fileA
和 String fileB
进行如下比较:
fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)
那么问题就变成我应该使用哪个语言文化,当前(UI?)语言文化是否足够?我似乎找不到任何用于此目的的基类库方法。
根据.NET框架中使用字符串的最佳实践,您应该使用StringComparison.OrdinalIgnoreCase
。
文件系统、注册表键和值以及环境变量的字符串行为最好由StringComparison.OrdinalIgnoreCase表示。
如果您使用一种文化来匹配字符串,则可能会出现这样的情况,例如名称"häl.gif"和"hal.gif"将被视为匹配。
这是不可靠的操作。
是的,文件系统的大小写转换是不区分大小写的。
但是大小写转换表存储在文件系统本身上(对于NTFS),而且在不同版本之间会发生变化(例如Vista将大小写转换表提升到了Unicode 5级别,因此Vista NTFS和XP NTFS具有不同的大小写转换规则)。
重要的是格式化文件系统的操作系统,而不是当前操作系统。
然后,您可能会遇到其他文件系统的各种问题(Mac OS执行某种Unicode标准化(不是标准的那个),Linux什么都不做,但Samba(实现Windows文件共享协议)会执行其他不同于Windows的表格)。
那么如果我映射一个字母到由Linux或Mac OS共享的网络磁盘会发生什么?
通常情况下,您不应尝试比较文件名。如果您想知道它是否存在,请尝试访问它。
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
你可以使用InvariantCulture(请查看http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx)。
在你的例子中:
FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )
我尝试过了。
Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))
Path.GetFullPath(path1).TrimEnd(Path.DirectorySeparatorChar).Equals(Path.GetFullPath(path2).TrimEnd(Path.DirectorySeparatorChar))
。 - SensorSmith