Cargando...

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.

Artículos relacionados