Introducción: ¿Por qué aprender a trabajar con archivos en JavaScript?
\n\nCuando hablamos de JavaScript, la mayoría de las personas piensan inmediatamente en el navegador y las interfaces interactivas. Sin embargo, con la llegada de la plataforma Node.js, JavaScript ha ido mucho más allá de las páginas web. Hoy en día es un lenguaje completo para el desarrollo del lado del servidor, la automatización y las utilidades. Y una de las tareas clave que todo desarrollador enfrenta es trabajar con el sistema de archivos.
\n\nLa capacidad de leer, escribir, mover y eliminar archivos es una habilidad fundamental sin la cual no se puede imaginar ningún proyecto serio. Ya sea un registrador, un archivo de configuración, cargas de imágenes o análisis de datos — el acceso al sistema de archivos se necesita en todas partes.
\n\nEn este artículo, cubriremos ejemplos prácticos de trabajo con el sistema de archivos en Node.js. Aprenderás cómo usar el módulo incorporado fs, qué métodos están disponibles y cómo evitar errores comunes. Todo el código se puede ejecutar y probar de inmediato.
Métodos básicos del módulo fs
\n\nEl módulo fs (File System) está incluido en la distribución estándar de Node.js. No necesita instalarse por separado. Para comenzar, simplemente impórtalo al inicio de tu archivo:
const fs = require('fs');\nconst fsPromises = require('fs').promises; // para trabajar con promesas\n\nTodos los métodos del módulo fs existen en tres variantes:
- \n
- Síncronos — bloquean la ejecución del código hasta que la operación se complete. Generalmente tienen el sufijo
Sync. \n - Asíncronos con callbacks — el estilo clásico de Node.js. \n
- Asíncronos con promesas — un enfoque moderno que utiliza
fs.promises. \n
En proyectos modernos, se recomienda usar promesas y async/await. Esto hace que el código sea más limpio y comprensible.
Lectura de archivos
\n\nEl escenario más común es leer el contenido de un archivo. Veamos un ejemplo con un archivo de texto data.txt:
const fs = require('fs').promises;\n\nasync function readFileExample() {\n try {\n const data = await fs.readFile('data.txt', 'utf8');\n console.log('Contenido del archivo:');\n console.log(data);\n } catch (err) {\n console.error('Error al leer el archivo:', err.message);\n }\n}\n\nreadFileExample();\n\nEl segundo parámetro 'utf8' especifica la codificación. Si lo omites, obtendrás un búfer sin procesar. Para archivos de texto, siempre especifica la codificación.
Escritura en un archivo
\n\nLa escritura de datos en un archivo se puede realizar de dos maneras: sobrescritura completa o agregar al final.
\n\nSobrescribir un archivo:
\nconst fs = require('fs').promises;\n\nasync function writeFileExample() {\n try {\n await fs.writeFile('output.txt', '¡Hola, sistema de archivos!');\n console.log('Archivo escrito exitosamente');\n } catch (err) {\n console.error('Error al escribir:', err.message);\n }\n}\n\nwriteFileExample();\n\nAgregar al final de un archivo:
\nconst fs = require('fs').promises;\n\nasync function appendFileExample() {\n try {\n await fs.appendFile('log.txt', `Nueva entrada: ${new Date().toISOString()}\\n`);\n console.log('Datos agregados');\n } catch (err) {\n console.error('Error al agregar:', err.message);\n }\n}\n\nappendFileExample();\n\nEl método appendFile es ideal para registro de eventos o acumulación de datos.
Gestión de directorios y archivos
\n\nTrabajar con el sistema de archivos no se limita a leer y escribir. A menudo es necesario crear carpetas, verificar si los archivos existen o eliminarlos.
\n\nCreación y eliminación de directorios
\n\nconst fs = require('fs').promises;\n\nasync function manageDirectories() {\n try {\n // Crear un directorio (si no existe)\n await fs.mk