17

鉴于(至少在 NTFS 上)Windows 上的文件系统是不区分大小写的,我想这样String fileA比较String fileB

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)

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

4

6 回答 6

27

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

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

如果您使用文化来匹配字符串,您可能会遇到例如名称“häl.gif”和“hal.gif”将被视为匹配的位置。

于 2009-11-18T15:27:58.843 回答
3

这是不可能可靠地做到的。

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

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

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

然后您可能会遇到其他文件系统的各种问题(Mac OS 进行某种 Unicode 规范化(不是标准的)),Linux 什么也不做,但 Samba(实现 Windows 文件共享协议)可以。并且有除 Windows 之外的其他表。

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

一般来说,您永远不应该尝试比较文件名。如果您想知道它是否存在,请尝试访问它。

于 2009-11-26T08:22:02.930 回答
2

马库斯,

您可能想查看另一个 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 或任何其他可能出现类似 å 组合的内容时,序数比较仍然提供最透明和最合适的行为。

希望这会有所帮助,波阿斯

于 2009-11-18T21:59:16.253 回答
0

也许你可以试试这个:http: //msdn.microsoft.com/en-us/library/zkcaxw5y.aspx

于 2009-11-18T15:26:28.503 回答
0

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

在您的示例中:


FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )
于 2009-11-18T15:32:52.143 回答
-1

我试过这个。

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))
于 2013-08-07T07:31:26.337 回答