Borrar un archivo en C#

File.Delete tiene una particularidad que lo distingue del resto de la clase File: si el archivo no existe, no hace nada y no protesta. Eso cambia cómo hay que escribir el código.

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.

Borrar un archivo

File.Delete(Path.Combine("salida", "renombrado.txt"));
File.Delete(Path.Combine("salida", "renombrado.txt"));   // ya no existe
salidaDelete dos veces: sin excepción la segunda

No hace falta comprobar con File.Exists antes, como hacía la versión anterior de esta página. Además, comprobar antes tiene un problema: entre la comprobación y el borrado otro programa puede cambiar las cosas. Llamar a Delete directamente hace las dos cosas a la vez.

Cuándo sí falla

File.Delete(Path.Combine("no_existe", "x.txt"));
salidaDirectoryNotFoundException: Could not find a part of the path '/trabajo/no_existe/x.txt'.
Si…Pasa
el archivo no existenada
no existe la carpetaDirectoryNotFoundException
el archivo está abierto (en Windows)IOException
es de solo lectura o no tienes permisoUnauthorizedAccessException

Carpetas

Directory.Delete("datos");                    // solo si está vacía
Directory.Delete("datos", recursive: true);   // con todo lo que tenga
salidaDelete sin recursive: IOException: Directory not empty : '/trabajo/datos'
Nada de esto va a la papelera de reciclaje. File.Delete y Directory.Delete borran de verdad, y con recursive: true se va el árbol entero. Antes de pasarle una ruta que se construye con variables, escríbela en la consola y mírala: un error en una variable y en lugar de una subcarpeta borras la carpeta del proyecto.
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.