鉴于(至少在 NTFS 上)Windows 上的文件系统是不区分大小写的,我想这样String fileA
比较String fileB
:
fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)
那么问题就变成了我应该使用哪种文化,默认的当前(ui?)文化就足够了吗?我似乎找不到任何用于此目的的 BCL 方法。
鉴于(至少在 NTFS 上)Windows 上的文件系统是不区分大小写的,我想这样String fileA
比较String fileB
:
fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)
那么问题就变成了我应该使用哪种文化,默认的当前(ui?)文化就足够了吗?我似乎找不到任何用于此目的的 BCL 方法。
StringComparison.OrdinalIgnoreCase
根据.NET Framework 中使用字符串的最佳实践,您应该使用.
文件系统、注册表项和值以及环境变量的字符串行为最好由 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 共享的网络磁盘会发生什么?
一般来说,您永远不应该尝试比较文件名。如果您想知道它是否存在,请尝试访问它。
马库斯,
您可能想查看另一个 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 或任何其他可能出现类似 å 组合的内容时,序数比较仍然提供最透明和最合适的行为。
希望这会有所帮助,波阿斯
也许你可以试试这个:http: //msdn.microsoft.com/en-us/library/zkcaxw5y.aspx
你可以使用 InvariantCulture (看看http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx)。
在您的示例中:
FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )
我试过这个。
Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))