鉴于(至少在NTFS上)Windows上的文件系统不区分大小写,我想将String fileA
与String fileB
进行比较:
fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)
那么问题就变成我应该使用哪种文化,默认的当前(ui?)文化是否足够?我似乎无法为此目的找到任何BCL方法。
答案 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))