C# – Renombrar archivo

C# no tiene un método «renombrar»: se usa File.Move con el mismo directorio y otro nombre. La única decisión que hay que tomar es qué hacer si ya existe un archivo con el nombre nuevo.

Sin namespace, sin class Program, sin Main. Los ejemplos usan instrucciones de nivel superior, disponibles desde C# 9: el compilador genera esa estructura por ti. Y desde .NET 10 un archivo suelto se ejecuta directamente con dotnet run archivo.cs, sin crear un proyecto. El código de siempre, con su static void Main, sigue funcionando igual. Tampoco hacen falta los using System;, System.IO y compañía: los proyectos modernos los incluyen de forma implícita.

Renombrar

string actual = Path.Combine("salida", "copia.txt");
string nuevo = Path.Combine("salida", "renombrado.txt");

File.Move(actual, nuevo);
salidamovido: existe el viejo False, el nuevo True

Si el nombre nuevo ya está ocupado

LlamadaSi el destino existe
File.Move(a, b)IOException
File.Move(a, b, overwrite: true)lo sustituye
salidaMove sobre uno que existe: IOException
Move con overwrite: true -> sin error

La versión anterior de esta página envolvía el Move en un try que capturaba cualquier excepción y escribía un mensaje genérico. Así se pierde el motivo. Estos son los que puede haber:

ExcepciónSignifica
FileNotFoundExceptionel archivo de origen no existe
DirectoryNotFoundExceptionno existe la carpeta de origen o la de destino
IOExceptionel destino ya existe, o el archivo está abierto por otro programa
UnauthorizedAccessExceptionno tienes permiso
En Windows, un archivo abierto por otro programa —un Excel abierto, un registro que alguien está escribiendo— no se puede mover ni renombrar: IOException. En Linux y macOS sí se puede. Si tu programa tiene que funcionar en los dos, cuenta con ese caso.

Con FileInfo

var archivo = new FileInfo(actual);
archivo.MoveTo(nuevo, overwrite: true);
Console.WriteLine(archivo.Name);      // ya apunta al nombre nuevo

Después de MoveTo, el propio objeto FileInfo pasa a referirse a la ruta nueva.

La versión anterior de esta página usaba rutas como C:\RutaArchivos\ o D:\dev\proyCs\, que solo existían en un ordenador. Aquí se usan rutas relativas y Path.Combine, que pone el separador correcto en cada sistema: el mismo código funciona en Windows, Linux y macOS.

Todo el código se ejecutó con .NET 10 en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.