Crear un directorio en C#

Directory.CreateDirectory hace exactamente lo que casi siempre quieres: crea la carpeta y todas las que falten por el camino, y si ya existe, no pasa nada.

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.

Crear

var d = Directory.CreateDirectory(Path.Combine("datos", "2026", "octubre"));
Console.WriteLine($"existe: {d.Exists}");

Directory.CreateDirectory(Path.Combine("datos", "2026", "octubre"));   // otra vez
salidacreado: True | existe: True
otra vez: sin error

Tres niveles de una vez, aunque no existiera ninguno. Y llamarlo sobre una carpeta que ya existe no lanza excepción, así que no hace falta comprobar antes con Directory.Exists, como hacía la versión anterior de esta página. Se puede llamar sin más al principio del programa.

Devuelve un DirectoryInfo con la información de la carpeta, por si la necesitas: su ruta completa, su fecha de creación o los archivos que contiene.

Una carpeta temporal

string tmp = Directory.CreateTempSubdirectory("decodigo-").FullName;
// ... trabajar ...
Directory.Delete(tmp, recursive: true);
salidatemporal: True

Desde .NET 7. Crea una carpeta con un nombre que no choca con nada dentro de la carpeta temporal del sistema. Borrarla al terminar es cosa tuya.

Cuándo sí falla

Si…Excepción
ya existe un archivo con ese nombreIOException
no tienes permiso para crear ahíUnauthorizedAccessException
la ruta tiene caracteres no válidosArgumentException o IOException, según el sistema
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.