Aquí es una solución básica y relativamente rápido, sigue leyendo a continuación para algunos comentarios:
private static string GetCase(string path)
{
DirectoryInfo dir = new DirectoryInfo(path);
if (dir.Exists)
{
string[] folders = dir.FullName.Split(Path.DirectorySeparatorChar);
dir = dir.Root;
foreach (var f in folders.Skip(1))
{
dir = dir.GetDirectories(f).First();
}
return dir.FullName;
}
else
{
return path;
}
}
La idea básica es que obtener subdirectorios de un objeto DirectoryInfo te ayudará el caso correcto, por lo que solo debemos dividir el nombre del directorio y caminar desde la raíz hasta el directorio de destino, obteniendo el caso adecuado en cada paso.
Mi respuesta inicial se basó en obtener la carcasa para cada carpeta en el disco, y funcionó pero fue lenta. Se me ocurrió una ligera mejora que almacenó los resultados, pero todavía era demasiado lenta para el uso diario. Puede ver el historial de edición de este comentario si necesita hacer esto para cada cosa en el disco, y aun así, probablemente haya formas de acelerar ese código. Era "así es como puedes hacerlo" y no "aquí hay una excelente manera de hacerlo".
Bertu, en su respuesta, se le ocurrió la idea de dividir la ruta en sus componentes y conseguir la pieza de carcasa por pieza, lo que se traduce en un aumento enorme velocidad ya que ya no está comprobando todo lo como en mi respuesta original. Bertu también generalizó su solución para hacer archivos y directorios. En mis pruebas, el código publicado arriba (que usa la idea de Bertu de "dividir el camino y hacerlo por piezas" pero se acerca iterativamente en lugar de recursivamente) se ejecuta en aproximadamente la mitad del tiempo del código de Bertu. No estoy seguro si eso se debe a que su método también maneja archivos, porque su uso de la recursión introduce una sobrecarga adicional, o porque termina llamando a Path.GetFileName(path)
y Path.GetDirectoryName(path)
en cada iteración. Dependiendo de sus necesidades exactas, es probable que una combinación de su respuesta y la mía resuelva su problema lo mejor posible en C#.
En ese sentido, debo mencionar que hay some limitations para el manejo de nombre de archivo .Net, y dado que hacer esto en .Net requiere hacer muchos objetos DirectoryInfo, es posible que desee considerar el código no administrado si este es su cuello de botella.
Hay no hay función para hacer eso, y tratar de normalizar cadenas como "HElloAgain" a "helloAgain" será un problema ya que incluso Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase ("HElloAgain") devolvería "Helloagain. –
@Agent, DirectoryInfo. GetDirectories() devuelve carpetas en el caso del sistema de archivos. – Kevin
Aceptado, wow No tenía idea de que hubiera nuevas respuestas aquí Gracias a Iceman y Bertu por ayudar a resolver esto. – Tom