本地化 - 如何检查Filename1和Filename2是否相同

时间:2009-07-31 10:40:12

标签: .net windows internationalization

我想知道用户提供的Filename1与存储在DB(Filename2)中的相同。

我准备使用

string.Equals(Filename1, Filename2, StringComparison.CurrentCultureIgnoreCase)

然后我怀疑是否应该使用StringComparison.InvariantCultureIgnoreCase

显然,我需要像操作系统一样,或使用适当的API。

在某些文化中,AFAIK,如果下一个字符大写,则字符(例如人声)可能会改变。

由于我主要针对讲英语的市场,我希望我的软件在全世界都能很好地运作。

3 个答案:

答案 0 :(得分:1)

是的,你应该使用不变的文化。我可能会在没有区分大小写的情况下这样做,因为我确信它不会影响不变的文化(否则它不会很好)。

如果您考虑(我不知道这是否属实),您的数据库是在使用不同文化的其他计算机上制作的,而不是使用不变的比较会导致您遇到问题。

如果你不忽略这种情况,那么如果我将'Windows'文件夹重命名为'windows',你就会说我的文件不再存在了,显然它们确实存在。

答案 1 :(得分:1)

引用Michael Kaplan

  

如果您尝试比较符号标识符或操作系统对象(如文件名或命名管道),请使用Ordinal类型方法(或OrdinalIgnoreCase类型方法)。

换句话说,使用StringComparison.OrdinalIgnoreCase作为string.Equals的参数来模仿Windows文件系统。

答案 2 :(得分:0)

如果文件实际存在于光盘上(我假设),您可以使用Directory.GetFiles()规范化文件名,然后比较规范文件名:

string fileName1 = @"C:\someFolder/sOmeFiLE.txt";
string fileName2 = @"C:\somefolder\someFile.txt";

string canonicalFileName1 = Directory.GetFiles(
        Path.GetDirectoryName(fileName1), 
        Path.GetFileName(fileName1))[0];

string canonicalFileName2 = Directory.GetFiles(
        Path.GetDirectoryName(fileName2), 
        Path.GetFileName(fileName2))[0];

bool isEqual = string.Compare(canonicalFileName1, canonicalFileName2) == 0;