C# Crear archivos de texto

La clase File escribe un archivo entero en una línea. Para lo demás —añadir, escribir mucho, elegir la codificación— hay tres o cuatro métodos más, y conviene saber cuál es cuál.

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.

Todo de una vez

string ruta = Path.Combine("salida", "notas.txt");
Directory.CreateDirectory("salida");

File.WriteAllText(ruta, "Primera línea\nSegunda línea\n");
Console.WriteLine($"escrito: {new FileInfo(ruta).Length} bytes");
salidaescrito: 30 bytes

WriteAllText crea el archivo o lo sobrescribe si existe. Lo que no hace es crear la carpeta: si no existe, lanza DirectoryNotFoundException; de ahí el CreateDirectory, que no falla si ya existe. Treinta bytes para veintiocho caracteres: cada «í» ocupa dos en UTF-8.

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.

Añadir y escribir líneas

File.AppendAllText(ruta, "Tercera línea\n");

File.WriteAllLines(Path.Combine("salida", "lineas.txt"), ["uno", "dos", "tres"]);
salidatras añadir: 45 bytes
uno | dos | tres

AppendAllText añade al final sin borrar. WriteAllLines escribe cada elemento en su línea. Los corchetes ["uno", "dos", "tres"] son una expresión de colección, de C# 12.

Escribir mucho: StreamWriter

using (var sw = new StreamWriter(Path.Combine("salida", "muchas.txt")))
{
    for (int i = 1; i <= 3; i++)
        sw.WriteLine($"línea {i}");
}

Cuando el contenido se genera en un bucle, un StreamWriter va escribiendo con un búfer. El using lo cierra al salir del bloque, también si salta una excepción, y es lo que garantiza que lo que quedaba en el búfer llegue al disco. Sin cerrarlo, las últimas líneas pueden perderse.

La BOM de UTF-8

salidaprimeros bytes: 507269  (sin BOM)
con BOM: EFBBBF

Los métodos de File escriben UTF-8 sin marca inicial. Algunos programas antiguos de Windows —el Excel de abrir un CSV con doble clic es el caso típico— necesitan esa marca, tres bytes EF BB BF al principio, para saber que el archivo es UTF-8; sin ella muestran las tildes rotas. Si te toca ese caso:

File.WriteAllText("con_bom.txt", "hola", new UTF8Encoding(true));
La versión anterior de esta página mezclaba en un mismo ejemplo líneas en español con un párrafo en inglés, «A class is the most powerful data type in C#…»: venía copiado del ejemplo de la documentación de Microsoft.

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.

Deja un comentario