Introducción: ¿Por qué es importante saber trabajar con archivos en JavaScript?
\n\nCuando hablamos de JavaScript, la mayoría recuerda inmediatamente el navegador y las interfaces interactivas. Sin embargo, con la aparición 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 a las que se enfrenta todo desarrollador es el trabajo con el sistema de archivos.
\n\nSaber leer, escribir, mover y eliminar archivos es una base sin la cual no se puede imaginar ningún proyecto serio. Ya sea un logger, un archivo de configuración, la carga de imágenes o el análisis de datos, en todas partes se necesita acceso al sistema de archivos.
\n\nEn este artículo, analizaremos ejemplos prácticos de trabajo con el sistema de archivos en Node.js. Aprenderá a utilizar el módulo incorporado fs, qué métodos existen y cómo evitar errores típicos. Todo el código se puede ejecutar y probar inmediatamente.
Métodos principales del módulo fs
\n\nEl módulo fs (File System) viene incluido en la instalación estándar de Node.js. No es necesario instalarlo por separado. Para empezar, basta con importarlo al principio del 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 se completa la operación. Normalmente tienen el sufijo
Sync. \n - Asíncronos con callbacks — el estilo clásico de Node.js. \n
- Asíncronos con promesas — el enfoque moderno a través de
fs.promises. \n
En proyectos modernos, se recomienda utilizar 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 el 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 se omite, obtendrá un buffer sin procesar (Buffer). Para archivos de texto, especifique siempre la codificación.
Escritura en un archivo
\n\nLa escritura de datos en un archivo se puede realizar de dos maneras: sobrescritura completa o añadir al final.
\n\nSobrescritura de 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 de escritura:', err.message);\n }\n}\n\nwriteFileExample();\n\nAñadir al final del 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 añadidos');\n } catch (err) {\n console.error('Error al añadir:', err.message);\n }\n}\n\nappendFileExample();\n\nEl método appendFile es ideal para llevar registros (logs) o acumular datos.
Gestión de directorios y archivos
\n\nEl trabajo con el sistema de archivos no se limita a la lectura y escritura. A menudo es necesario crear carpetas, verificar la existencia de archivos o eliminarlos.
\n\nCreación y eliminación de directorios
\n\nconst fs = require('fs').promises;\n\nasync function manageDirectories() {\n try {\n // Creación de directorio (si no existe)\n await fs.mk