Trabajo con el sistema de archivos en JavaScript en Node.js: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: por qué es importante trabajar con el sistema de archivos en Node.js

En el desarrollo web moderno, rara vez se puede prescindir de la interacción con el sistema de archivos. Ya sea la carga de avatares de usuarios, la generación de registros, el procesamiento de informes CSV o la lectura de archivos de configuración, Node.js proporciona un potente módulo integrado fs (File System) para estas tareas.

A diferencia de JavaScript en el navegador, donde el acceso a los archivos está estrictamente limitado por razones de seguridad, Node.js brinda control total sobre el sistema de archivos del servidor. En este artículo, analizaremos las operaciones clave con ejemplos prácticos que lo ayudarán a trabajar con confianza con archivos y carpetas.



Qué aprenderá:

  • Cómo leer y escribir archivos (de forma síncrona y asíncrona)
  • Cómo trabajar con flujos (Streams) para archivos grandes
  • Cómo crear, renombrar y eliminar carpetas
  • Cómo manejar correctamente errores y rutas


1. Conceptos básicos: lectura y escritura de archivos

El módulo fs ofrece tres enfoques principales para trabajar con archivos: síncrono, asíncrono (con callbacks) y basado en promesas. Se recomienda utilizar el enfoque asíncrono basado en promesas (fs.promises): no bloquea el Event Loop y es más fácil de leer.



1.1 Lectura de un archivo

La forma más sencilla de leer un archivo completo es usar readFile.

const fs = require('fs').promises;

async function readConfig() { try { const data = await fs.readFile('./config.json', 'utf-8'); const config = JSON.parse(data); console.log('Puerto:', config.port); } catch (err) { console.error('Error de lectura:', err.message); }}

readConfig();

Importante: Especifique la codificación ('utf-8'), de lo contrario se devolverá un objeto Buffer.



1.2 Escritura en un archivo

Para escribir, use writeFile (sobrescribe el archivo) o appendFile (agrega al final).

const fs = require('fs').promises;

async function saveLog(message) { const logLine = `[${new Date().toISOString()}] ${message}`; try { await fs.appendFile('./app.log', logLine); console.log('Registro guardado'); } catch (err) { console.error('Error de escritura:', err); }}

saveLog('Servidor iniciado');


2. Trabajo con archivos grandes: Streams (flujos)

Imagine que necesita leer un archivo de 2 GB. El método readFile lo cargaría completamente en la memoria RAM, lo que podría provocar una fuga de memoria. Para estos casos existen los flujos (fs.createReadStream y fs.createWriteStream).

Un flujo procesa los datos en partes (fragmentos), sin almacenar todo el archivo en la memoria.



Ejemplo: copiar un archivo grande

const fs = require('fs');const path = require('path');

const source = path.join(__dirname, 'bigfile.zip');const destination = path.join(__dirname, 'copy.zip');

const readStream = fs.createReadStream(source);const writeStream = fs.createWriteStream(destination);

readStream.on('data', (chunk) => { console.log(`Leídos ${chunk.length} bytes`); writeStream.write(chunk);});

readStream.on('end', () => { writeStream.end(); console.log('Copia completada');});

readStream.on('error', (err) => { console.error('Error de lectura:', err);});

Consejo: Para copiar, es más conveniente usar el método integrado pipeline del módulo stream: maneja automáticamente los errores y cierra los flujos.



3. Gestión de directorios

Trabajar con carpetas es una parte igualmente importante. Node.js permite crear, leer y eliminar directorios.



3.1 Creación y verificación de una carpeta

const fs = require('fs').promises;

async function ensureDir(dirPath) { try { await fs.mkdir(dirPath, { recursive: true }

Blogs

Book Recommendations