2009-10-26 25 views
8

Estoy intentando cambiar el nombre de un directorio en C# a un nombre que sea el mismo solo con mayúsculas y minúsculas.Renombrar Directorio con el mismo nombre en mayúsculas o minúsculas

Por ejemplo: f: \ test a F: \ TEST

He probado este código:

var directory = new DirectoryInfo("f:\\test"); 
directory.MoveTo("f:\\TEST"); 

y me da una IOException - Fuente y ruta de destino deben ser diferentes. También probé Directory.Move() con el mismo resultado.

¿Cómo se hace esto? ¿Tengo que crear un directorio temporal separado, mover los archivos contenidos desde el directorio original al directorio temporal, y luego eliminar el original y cambiar el nombre del directorio temporal?

Respuesta

11

Bueno, no necesita crear un directorio separado y mover todo. Sólo cambiar el nombre de la carpeta a algo diferente y luego de nuevo al nombre que desee:

var dir = new DirectoryInfo(@"F:\test"); 
dir.MoveTo(@"F:\test2"); 
dir.MoveTo(@"F:\TEST"); 
+0

gracias, eso tiene mucho más sentido que la forma en que describí hacerlo. – scott

+2

En realidad, 'MoveFileEx' ni siquiera necesita esa bandera para hacerlo; incluso puedes usar 'MoveFile', y funciona bien. Es el BCL el que impide el cambio de nombre, no Win32. –

-1

La respuesta es sí en este caso - el sistema de archivos en sí no los ve como diferentes, por lo que deberá eliminar y agregar como el nuevo nombre (o mover/eliminar/mover como sugirió)

+5

El sistema de archivos sí. El contenedor de API de Windows a su alrededor presenta insensibilidad a mayúsculas y minúsculas. – Joey

1

¿Por qué no cambiar el nombre del directorio temp y luego cambiar el nombre nuevamente a TEST?

0

Incluso si el método .NET DirectoryInfo.MoveTo lanza una excepción si el nombre es el mismo, puede llamar a la función API de Windows MoveFile como esto para fijar la carcasa del nombre del directorio:

bool success = MoveFile(dirInfo.FullName, dirInfo.FullName); 

con esta declaración extern:

[DllImport("kernel32", SetLastError = true)] 
private static extern bool MoveFile(string lpExistingFileName, string lpNewFileName); 

funciona bien para mí cuando º El nombre difiere solo en el caso. No he intentado llamarlo así cuando el nombre ya es exactamente como se especificó.

Esto tiene la ventaja de que el directorio nunca desaparece con su nombre original.

Tiene la desventaja de que solo funciona en Windows.

Cuestiones relacionadas