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.
También te puede interesar
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.
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));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.