C# нечувствительность к регистру сравнения строк пути к файлу

Я хотел бы сравнить две строки, содержащие пути к файлам в C#.

Однако, поскольку в ntfs по умолчанию используются пути без учета регистра, я бы хотел, чтобы сравнение строк выполнялось без учета регистра аналогичным образом.

Однако я не могу найти никакой информации о том, как ntfs фактически реализует свою нечувствительность к регистру. Я хотел бы знать, как выполнить сравнение строк без учета регистра, используя те же правила размещения, которые ntfs использует для путей к файлам.

4 ответа

Решение

Из MSDN:

Строковое поведение файловой системы, разделов и значений реестра и переменных среды лучше всего представлено как StringComparison.OrdinalIgnoreCase,

А также:

При интерпретации имен файлов, файлов cookie или чего-либо еще, где может появляться такая комбинация, как "å", порядковые сравнения по-прежнему предлагают наиболее прозрачное и подходящее поведение.

Поэтому это просто:

String.Equals(fileNameA, fileNameB, StringComparison.OrdinalIgnoreCase)

(Я всегда использую статический Equals вызов в случае, если левый операнд null)

При сравнении путей направление разделителя пути также очень важно. Например:

 bool isEqual = String.Equals("myFolder\myFile.xaml", "myFolder/myFile.xaml", StringComparison.OrdinalIgnoreCase);

isEqual будет false,

Поэтому сначала нужно исправить пути:

 private string FixPath(string path)
    {
        return path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
                   .ToUpperInvariant();
    }

Тогда как это выражение будет true:

bool isEqual = String.Equals(FixPath("myFolder\myFile.xaml"), FixPath("myFolder/myFile.xaml"), StringComparison.OrdinalIgnoreCase);
string path1 = "C:\\TEST";
string path2 = "c:\\test";

if(path1.ToLower() == path2.ToLower())
    MessageBox.Show("True");

Вы имеете в виду это или я не получил вопрос?

Я бы пошел на

string.Compare(path1, path2, true) == 0

или если вы хотите указать культуры:

string.Compare(path1, path2, true, CultureInfo.CurrentCulture) == 0 

использование ToUpper делает бесполезное распределение памяти каждый раз, когда вы сравниваете что-то

Другие вопросы по тегам