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

Posted

技术标签:

【中文标题】.NET如何比较两个代表文件名的字符串忽略大小写正确【英文标题】:.NET How to compare two Strings that represent filenames ignoring case correctly 【发布时间】:2009-11-18 15:19:47 【问题描述】:

鉴于(至少在 NTFS 上)Windows 上的文件系统不区分大小写,我想将 String fileAString fileB 进行比较:

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)

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

【问题讨论】:

出于这些目的,我总是建议 CultureInfo.InvariantCulture 【参考方案1】:

你应该使用StringComparison.OrdinalIgnoreCase,根据Best Practices for Using Strings in the .NET Framework。

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

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

【讨论】:

它确实回答了这个问题。不应使用培养物。 NTFS 文件名比较是有序的。 我试图在 MSDN 上找到支持这一点的官方声明,但找不到。如果有人找到,请链接到它。【参考方案2】:

这是不可能做到可靠的。

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

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

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

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

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

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

【讨论】:

【参考方案3】:

马库斯,

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

那是用现在的文化,所以和他已有的文化是一样的。 是的,抱歉,我稍后才发现。【参考方案5】:

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

在你的例子中:


FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )

【讨论】:

不要 - 这与 NTFS 规则不一致。使用序数比较。【参考方案6】:

我试过了。

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

【讨论】:

更好Path.GetFullPath(path1).TrimEnd(Path.DirectorySeparatorChar).Equals(Path.GetFullPath(path2).TrimEnd(Path.DirectorySeparatorChar))

以上是关于.NET如何比较两个代表文件名的字符串忽略大小写正确的主要内容,如果未能解决你的问题,请参考以下文章

C++ , winapi 比较两个 WCHAR * 字符串

AC日记——忽略大小写的字符串比较 openjudge 1.7 16

如何在忽略大小写的sql中比较字符串?

java_函数手册_String_1.5_compareToIgnoreCase_忽略大小写比较两个字符串

比较 char 忽略大小写的正确方法是啥?

比较 char 忽略大小写的正确方法是啥?