Node: Sistema de archivos

Descubre cómo utilizar Node.js para leer, escribir y manipular archivos con el módulo fs. Configura rutas, maneja directorios y optimiza tus operaciones de entrada y salida en el sistema de archivos.

Aprende Node GRATIS y certifícate

Trabajar con el sistema de archivos es una de las tareas más habituales en desarrollos con Node.js. El módulo fs proporciona métodos para leer, escribir y actualizar ficheros de manera asíncrona y eficiente.

Introducción al módulo fs

El módulo fs es nativo de Node.js y no requiere instalación adicional. Importar este módulo abre la puerta a la gestión de archivos y directorios, lo que facilita múltiples funciones para la persistencia de información en discos locales.

const fs = require('fs');

Gracias a su enfoque asíncrono, es posible realizar operaciones de lectura o escritura sin bloquear la ejecución principal de la aplicación, lo que se traduce en mayor rendimiento.

Lectura de ficheros

Para leer el contenido de un archivo, se utiliza el método readFile de manera asíncrona, indicando la ruta del fichero y el formato de codificación. Un ejemplo:

fs.readFile('datos.txt', 'utf8', (error, contenido) => {
  if (error) {
    console.error('Error al leer archivo:', error);
    return;
  }
  console.log('Contenido:', contenido);
});

Si la operación es exitosa, se obtiene el texto almacenado; en caso de fallo, se captura el error y se notifica para su resolución.

Escritura de ficheros

Para escribir datos en un archivo, se emplea writeFile, donde se define el contenido y la ruta destino:

fs.writeFile('salida.txt', 'Texto de ejemplo', (error) => {
  if (error) {
    console.error('Error al escribir archivo:', error);
    return;
  }
  console.log('Archivo creado o modificado con éxito');
});

Si el archivo no existe, Node.js lo crea. Este método se utiliza con frecuencia para generar reportes, logs o registros de actividades.

Manejo de rutas con path

El módulo path ayuda a crear rutas de forma segura y compatible con diferentes sistemas operativos. Un ejemplo breve de su uso:

const path = require('path');

const rutaCompleta = path.join(__dirname, 'carpeta', 'archivo.txt');
console.log('Ruta generada:', rutaCompleta);

La combinación de fs y path evita problemas relacionados con diferencias en la sintaxis de rutas entre plataformas y garantiza una manipulación de ficheros más sólida.

Operaciones con directorios

El módulo fs ofrece métodos para crear, leer y eliminar directorios. El método mkdir crea una carpeta nueva, mientras que readdir devuelve el listado de ficheros en la carpeta:

fs.mkdir('nuevaCarpeta', (error) => {
  if (error) {
    console.error('Error al crear carpeta:', error);
    return;
  }
  console.log('Carpeta creada con éxito');
});

Con fs.readdir, se puede iterar sobre el contenido del directorio e inspeccionar cada archivo o subcarpeta.

Lectura y escritura síncrona

A pesar de que la mayoría de métodos del módulo fs funcionan de forma asíncrona, también existen versiones síncronas como readFileSync y writeFileSync. Estas funciones bloquean el hilo de ejecución hasta finalizar, por lo que se recomienda usarlas con precaución:

try {
  const contenido = fs.readFileSync('datos.txt', 'utf8');
  console.log('Lectura síncrona:', contenido);
} catch (error) {
  console.error('Error en lectura síncrona:', error);
}

Elegir entre la variante asíncrona o síncrona depende de las necesidades del proyecto y el impacto en la performance.

Manejo de errores y excepciones

Dado que las operaciones de entrada y salida son susceptibles a problemas como rutas inválidas o permisos restringidos, se aconseja implementar estructuras de control de errores. Mediante callbacks o promesas, el error puede ser detectado y gestionado sin bloquear la aplicación:

  • Validar que los ficheros existan antes de leerlos.
  • Revisar los permisos de escritura para evitar fallos inesperados.
  • Utilizar bloques try/catch en funciones síncronas o catch en promesas asíncronas.

Uso de promesas y async/await

Para trabajar con promesas, se dispone de la librería fs.promises. Con ella, se simplifica el código y se mejora la legibilidad:

const { readFile, writeFile } = require('fs').promises;

async function gestionarFicheros() {
  try {
    const data = await readFile('datos.txt', 'utf8');
    console.log('Datos leídos:', data);

    await writeFile('nuevo.txt', data + '\nTexto adicional');
    console.log('Fichero escrito');
  } catch (error) {
    console.error('Error en promesas:', error);
  }
}

gestionarFicheros();

Este enfoque con async/await facilita la creación de secuencias lógicas sin necesidad de anidar callbacks.

Buenas prácticas al manipular archivos

  • Verificar la existencia de directorios antes de escribir en una ruta.
  • Manejar rutas relativas con cuidado o usar rutas absolutas para mayor claridad.
  • Evitar bloqueos del hilo principal con métodos síncronos en procesos críticos.
  • Cerrar recursos abiertos o streams para liberar memoria.
  • Estructurar el código con funciones reutilizables que manejen distintas operaciones de E/S.

Casos de uso comunes

  • Lectura de archivos de configuración para inicializar variables en el arranque de una aplicación.
  • Generación dinámica de logs o reportes basados en eventos de la aplicación.
  • Mantenimiento de archivos temporales o cachés en proyectos de Node.js que procesan ficheros multimedia.
  • Automatización de tareas de backup o sincronización de contenido con sistemas de archivos externos.
Empezar curso de Node

Lecciones de este módulo de Node

Lecciones de programación del módulo Sistema de archivos del curso de Node.