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

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

 fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase) 

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

您应该使用StringComparison.OrdinalIgnoreCase ,详见“在.NET Framework中使用字符串的最佳实践 ”(搜索“文件路径”以查找相关部分)。

如果您使用文化来匹配字符串,您可能会参与其中,例如名称“häl.gif”和“hal.gif”将被视为匹配。

马库斯,

您可能希望查看另一个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,希望这会有所帮助

这是不可能做到的。

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

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

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

然后你可以遇到其他文件系统的所有问题(Mac OS做某种Unicode规范化(不是标准的)),Linux没有做任何事情,但Samba(实现Windows文件共享协议)确实如此。 还有其他表而不是Windows。

那么如果我将一封信映射到Linux或Mac OS共享的网络磁盘会怎样?

通常,您不应该尝试比较文件名。 如果您想知道它是否存在,请尝试访问它。

也许你可以试试这个: 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))