Entrada/Salida de archivos y API de Stream en C#
Aprende entrada/salida de archivos y API Stream en C# para leer y escribir datos de manera eficiente.
En C#, File IO (Input/Output) y la API Stream son los mecanismos básicos para leer y escribir archivos.
Los archivos pueden procesarse como texto o en formato binario, y el enfoque de flujo (stream) permite manejar grandes cantidades de datos de manera eficiente sin cargarlos completamente en memoria.
En este artículo veremos File, FileInfo, StreamReader/StreamWriter,
FileStream y BinaryReader/BinaryWriter con ejemplos completos.
Clase File
La clase File proporciona métodos estáticos para operaciones rápidas con archivos.
Los métodos más comunes son: WriteAllText, ReadAllText, AppendAllText, Exists, Delete.
using System;
using System.IO;
// Escribir en un archivo
File.WriteAllText("demo.txt", "¡Hola Mundo!");
// Leer un archivo
string contenido = File.ReadAllText("demo.txt");
Console.WriteLine(contenido);
// Verificar si el archivo existe
if (File.Exists("demo.txt"))
Console.WriteLine("El archivo existe.");
// Agregar a un archivo
File.AppendAllText("demo.txt", "\nNueva línea añadida.");
// Eliminar un archivo
File.Delete("temp.txt");
Clase FileInfo
FileInfo es basada en instancias y proporciona información detallada y operaciones sobre los archivos.
Contiene métodos como Exists, Create, Delete, CopyTo y MoveTo.
var info = new FileInfo("ejemplo.txt");
// Crear el archivo si no existe
if (!info.Exists)
{
using (var sw = info.CreateText())
sw.WriteLine("Este archivo fue creado con FileInfo.Create.");
}
// Mostrar información del archivo
Console.WriteLine($"Nombre: {info.Name}, Tamaño: {info.Length} bytes, Ruta: {info.FullName}");
// Copiar el archivo
info.CopyTo("ejemplo_copia.txt", overwrite: true);
// Mover el archivo
info.MoveTo("nuevo_ejemplo.txt");
// Eliminar el archivo
var eliminar = new FileInfo("nuevo_ejemplo.txt");
if (eliminar.Exists)
eliminar.Delete();
StreamReader y StreamWriter
StreamReader y StreamWriter se utilizan para operaciones de archivos basadas en texto.
Con un bloque using, el archivo se cierra automáticamente después de la operación.
// Escribir en un archivo de texto
using (var writer = new StreamWriter("texto.txt"))
{
writer.WriteLine("Línea 1");
writer.WriteLine("Línea 2");
}
// Leer desde un archivo de texto
using (var reader = new StreamReader("texto.txt"))
{
string linea;
while ((linea = reader.ReadLine()) != null)
Console.WriteLine(linea);
}
// Salida:
// Línea 1
// Línea 2
FileStream
FileStream permite leer y escribir archivos a nivel de bytes.
Es especialmente útil para trabajar con archivos grandes como imágenes o videos.
// Escribir bytes en un archivo
byte[] datos = { 72, 101, 108, 108, 111 }; // "Hello"
using (var fs = new FileStream("datos.bin", FileMode.Create))
{
fs.Write(datos, 0, datos.Length);
}
// Leer bytes de un archivo
using (var fs = new FileStream("datos.bin", FileMode.Open))
{
int b;
while ((b = fs.ReadByte()) != -1)
Console.Write((char)b);
}
// Salida: Hello
BinaryReader y BinaryWriter
BinaryReader y BinaryWriter permiten escribir/leer tipos primitivos
(int, double, string, etc.) directamente en/desde un flujo binario.
using (var bw = new BinaryWriter(File.Open("numeros.dat", FileMode.Create)))
{
bw.Write(42);
bw.Write(3.14);
bw.Write("Hola");
}
using (var br = new BinaryReader(File.Open("numeros.dat", FileMode.Open)))
{
int i = br.ReadInt32();
double d = br.ReadDouble();
string s = br.ReadString();
Console.WriteLine($"{i}, {d}, {s}");
}
// Salida: 42, 3.14, Hola
Aplicación de ejemplo: Gestión de archivos de log
En el siguiente ejemplo, los registros de la aplicación se escriben en un archivo con StreamWriter,
y luego se leen con StreamReader.
Además, se utiliza FileInfo para verificar si el archivo existe y crearlo si es necesario.
public class Logger
{
private readonly FileInfo _file = new FileInfo("app.log");
public void Log(string message)
{
if (!_file.Exists)
using (var created = _file.CreateText())
created.WriteLine("Archivo de log creado.");
using (var sw = new StreamWriter(_file.FullName, append: true))
sw.WriteLine($"{DateTime.Now}: {message}");
}
public void ShowLogs()
{
if (_file.Exists)
{
using (var sr = new StreamReader(_file.FullName))
Console.WriteLine(sr.ReadToEnd());
}
else
{
Console.WriteLine("Archivo de log no encontrado.");
}
}
public void ClearLogs()
{
if (_file.Exists)
_file.Delete();
}
}
class Program
{
static void Main()
{
var logger = new Logger();
logger.Log("Aplicación iniciada.");
logger.Log("¡Ocurrió un error!");
logger.ShowLogs();
logger.ClearLogs();
}
}
// Ejemplo de salida:
// 19/09/2025 12:10:05: Aplicación iniciada.
// 19/09/2025 12:10:05: ¡Ocurrió un error!
Resumen (TL;DR)
File: Operaciones estáticas con archivos (WriteAllText,ReadAllText,AppendAllText,Exists,Delete).FileInfo: Operaciones basadas en instancias (Create,CopyTo,MoveTo,Delete,Exists).StreamReader/StreamWriter: Lectura/escritura de texto.FileStream: Acceso a nivel de bytes, adecuado para archivos grandes.BinaryReader/BinaryWriter: Lectura/escritura de tipos primitivos en formato binario.- La API Stream permite procesar archivos grandes de manera eficiente sin cargarlos completamente en memoria.