Resumen

Dominar la lectura y escritura de archivos es una habilidad esencial en cualquier aplicación profesional con C#. Desde configuraciones hasta registros de auditoría, la persistencia de datos aparece en prácticamente todos los proyectos. Aquí se explica paso a paso cómo construir una clase FileManager que centraliza toda la lógica de archivos usando System.IO, aplicando principios de diseño que facilitan el mantenimiento y la escalabilidad.

¿Por qué centralizar la lógica de archivos en una clase FileManager?

Cuando las operaciones de lectura y escritura se dispersan por todo el sistema, aparece la duplicación de código y aumenta la complejidad. La clase FileManager resuelve esto al concentrar cada operación en un solo lugar [0:20]. Si mañana cambia la forma de almacenar archivos, solo hay que modificar esta clase; el resto del sistema permanece intacto.

Este enfoque aplica el principio SOLID y la programación orientada a objetos: cada clase tiene una sola responsabilidad. Program.cs consume y FileManager ejecuta las operaciones de System.IO [0:34].

Las tres clases fundamentales del namespace System.IO que se utilizan son:

  • File: maneja operaciones sobre archivos.
  • Directory: maneja carpetas y subdirectorios.
  • Path: normaliza rutas multiplataforma.

¿Cómo funcionan los métodos principales de FileManager?

¿Qué hace el método Escribir con WriteAllText?

El método Escribir guarda contenido en un archivo. Si el archivo ya existe lo sobreescribe; si no, lo crea automáticamente [1:00]. Internamente usa File.WriteAllText, un método estático que abre, escribe y cierra el archivo de forma automática, sin necesidad de manejar streams manualmente [1:18].

¿Cómo leer y agregar contenido de forma segura?

El método Leer retorna el contenido completo de un archivo usando File.ReadAllText. Es simple y eficaz para archivos pequeños o medianos. Si el archivo no existe, lanza una FileNotFoundException [1:35]. Para archivos muy grandes conviene leer línea por línea.

El método Agregar añade contenido al final sin borrar lo existente, usando File.AppendAllText en append mode [2:05]. Esto resulta ideal para:

  • Logs de aplicación.
  • Registros de auditoría.
  • Historiales de actividad.

¿Cómo verificar, eliminar y trabajar con líneas?

El método Existe utiliza File.Exists para comprobar si un archivo se encuentra en la ruta especificada, retornando true o false sin necesidad de abrir el archivo [2:30]. Esto es útil para validar antes de leer o decidir si crear un nuevo archivo.

El método Eliminar usa File.Delete para borrar un archivo. Si no existe, no lanza excepción, pero sí lo hace ante permisos insuficientes [2:52].

Para trabajar con múltiples líneas existen dos métodos clave:

  • LeerLíneas: usa File.ReadAllLines, que abre el archivo y lo divide por saltos de línea, retornando un array de strings donde cada elemento es una línea completa [3:10].
  • EscribirLíneas: usa File.WriteAllLines, que recibe un IEnumerable<string> (puede ser list o array) y escribe cada elemento como una línea con salto automático [3:33].

¿Cómo gestionar directorios y buscar archivos por patrón?

El método CrearDirectorio usa Directory.CreateDirectory para crear una carpeta en la ruta especificada [4:00]. Si la carpeta ya existe, no lanza excepción. Además, crea automáticamente cualquier subdirectorio padre que no exista, por ejemplo, si la ruta es datos/inventario y datos no existe, lo genera sin error.

El método ObtenerArchivos usa Directory.GetFiles para listar archivos que coincidan con un patrón de búsqueda [4:22]. Un patrón es una expresión como *.txt o *.json, donde el carácter asterisco representa "cualquier archivo".

Al probar la clase en Program.cs, se importa el namespace con using inventory_app.infrastructure, se crea una instancia de FileManager, se escribe un archivo llamado inventario.txt con el contenido "inventario actualizado" y luego se lee e imprime en consola [4:45]. El resultado confirma que la escritura y lectura funcionan correctamente.

ReadAllLines devuelve un arreglo donde cada elemento es una línea, mientras que WriteAllLines recibe una colección y escribe cada elemento en su propia línea [5:40]. Esto permite tratar el archivo no como un bloque único de texto, sino de forma granular.

En total, la clase FileManager implementa: escritura, lectura, agregado, verificación, eliminación, trabajo por líneas, creación de directorios y búsqueda por patrón [6:25]. Todo centralizado y listo para conectarse en la próxima etapa con serialización JSON, permitiendo guardar y cargar objetos completos como persistencia real.

¿Ya has implementado una clase similar en tus proyectos? Comparte tu experiencia y cuéntanos cómo manejas la lógica de archivos en tus aplicaciones.