Поскольку ответ Борха не работает для томов, где имена 8.3 отключены, здесь предлагается рекурсивная реализация, которую предлагает Tergiver (работает с файлами и папками, а также с файлами и папками общих папок UNC, но не на именах их компьютеров или их общих ресурсахимена).
Несуществующий файл или папки не являются проблемой, то, что существует, проверяется и исправляется, но вы можете столкнуться с проблемами перенаправления папок, например, при попытке получить правильный путь к «C: \ WinDoWs \ sYsteM32 \».driVErs \ eTC \ Hosts "вы получите" C: \ Windows \ System32 \ drivers \ eTC \ hosts "в 64-битных окнах, поскольку нет папки" etc "с" C: \ Windows \ sysWOW64 \ drivers ".
Сценарий тестирования:
Directory.CreateDirectory(@"C:\Temp\SomeFolder");
File.WriteAllLines(@"C:\Temp\SomeFolder\MyTextFile.txt", new String[] { "Line1", "Line2" });
Использование:
FileInfo myInfo = new FileInfo(@"C:\TEMP\SOMEfolder\MyTeXtFiLe.TxT");
String myResult = myInfo.GetFullNameWithCorrectCase(); //Returns "C:\Temp\SomeFolder\MyTextFile.txt"
Код:
public static class FileSystemInfoExt {
public static String GetFullNameWithCorrectCase(this FileSystemInfo fileOrFolder) {
//Check whether null to simulate instance method behavior
if (Object.ReferenceEquals(fileOrFolder, null)) throw new NullReferenceException();
//Initialize common variables
String myResult = GetCorrectCaseOfParentFolder(fileOrFolder.FullName);
return myResult;
}
private static String GetCorrectCaseOfParentFolder(String fileOrFolder) {
String myParentFolder = Path.GetDirectoryName(fileOrFolder);
String myChildName = Path.GetFileName(fileOrFolder);
if (Object.ReferenceEquals(myParentFolder, null)) return fileOrFolder.TrimEnd(new char[]{Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });
if (Directory.Exists(myParentFolder)) {
//myParentFolder = GetLongPathName.Invoke(myFullName);
String myFileOrFolder = Directory.GetFileSystemEntries(myParentFolder, myChildName).FirstOrDefault();
if (!Object.ReferenceEquals(myFileOrFolder, null)) {
myChildName = Path.GetFileName(myFileOrFolder);
}
}
return GetCorrectCaseOfParentFolder(myParentFolder) + Path.DirectorySeparatorChar + myChildName;
}
}