Как найти истинное (с учетом регистра) имя файла в С#/.NET?

Я работаю с файлами в файловой системе без учета регистра (Mac/Windows) на С#. Но я хотел бы узнать настоящее (с учетом регистра) имя этого файла, хранящегося на диске.

Я попытался сделать new FileInfo(filePath) и проверить полное имя, но это просто возвращает мне путь, который я ему дал. И свойство Name просто удаляет каталог, снова давая мне имя, которое я передал, а не имя файла, фактически хранящегося на диске.

Думаю, я мог бы перебрать все файлы в родительском каталоге и найти тот, который лучше всего соответствует интересующему файлу, но это убьет производительность. Наверняка где-то есть API, который сделает это эффективно?


person Joe Strout    schedule 17.01.2021    source источник
comment
В случае, если это поможет, в этой теме предлагается, чтобы функции Windows C GetFilePath и GetLongPathName возвращали правильный регистр, хранящийся на диске в Windows: forums.codeguru.com/ Таким образом, API-интерфейсы существуют для этого, по крайней мере, в Windows. Я просто ищу что-то в .NET, что может сделать это кросс-платформенным.   -  person Joe Strout    schedule 18.01.2021


Ответы (1)


В моем тесте это дает имя, записанное на диске

var x = Directory.GetFiles(@"E:\temp", "TEST.EXE");
Console.WriteLine(x); // => outputs: E:\temp\test.exe
person Steve    schedule 17.01.2021
comment
Не будет ли это внутренне перебирать все файлы, которые OP хотел предотвратить? - person Guru Stron; 17.01.2021
comment
Возможно, но где-то должна быть какая-то петля. Если только мы не сможем получить прямой доступ к базовой структуре, хранящейся в файловой системе. Я не знаю, возможно ли это в коде высокого уровня или даже существует ли для этого какой-либо API. Код метода GetFiles опубликован на сайте referencesource.com. Хотелось бы посмотреть, но сейчас нет времени. - person Steve; 17.01.2021
comment
Хм. Для меня GetFiles кажется единственным API, связанным с файлами, который я нашел до сих пор, который чувствителен к регистру. Он возвращает пустой массив, если имя файла, указанное в качестве шаблона поиска, не соответствует фактическому файлу в случае. (Возможно, мне следовало указать, что я использую Unity, тестируя как .NET 2.0, так и 4.x.) - person Joe Strout; 18.01.2021
comment
И да, быстрый просмотр справочного источника, похоже, указывает на то, что он перебирает все файлы в каталоге и потенциально выполняет более сложную обработку (глобальное сопоставление), чем мне пришлось бы делать самому. - person Joe Strout; 18.01.2021