Módulo fs de Node.js

Java FileMódulos integrados de Node.js


El módulo fs (File System) es un módulo central integrado de Node.js que se utiliza para interactuar con el sistema de archivos.

El módulo fs proporciona una serie de métodos para manejar operaciones como lectura, escritura y eliminación de archivos.

El módulo fs es uno de los módulos más utilizados en el desarrollo con Node.js, especialmente en escenarios donde se necesita manejar archivos locales.


¿Cómo usar el módulo fs?

Para usar el módulo fs, primero debes importarlo:

const fs = require('fs');

Desde Node.js 14, también puedes usar la sintaxis import de ES6:

Ejemplo

const fs = require('fs');          // Forma CommonJS
// o
import fs from 'fs';              // Forma ES Module

Métodos principales del módulo fs

1. Lectura de archivos

Lectura síncrona de archivos (readFileSync)

Ejemplo

const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
  • 'example.txt': ruta del archivo a leer
  • 'utf8': especificar el formato de codificación (opcional)
  • El método síncrono bloquea la ejecución del código hasta que se complete la lectura del archivo

Lectura asíncrona de archivos (readFile)

Ejemplo

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
  • El método asíncrono no bloquea la ejecución del código
  • Procesa el resultado mediante una función de devolución de llamada (callback)
  • La devolución de llamada con prioridad de error (err-first callback) es un patrón común en Node.js

2. Escritura de archivos

Escritura síncrona de archivos (writeFileSync)

Ejemplo

fs.writeFileSync('output.txt', 'Hello, Node.js!');

Escritura asíncrona de archivos (writeFile)

Ejemplo

fs.writeFile('output.txt', 'Hello, Node.js!', (err) => {
  if (err) throw err;
  console.log('Archivo guardado');
});

3. Añadir contenido a archivos (append)

Adición síncrona (appendFileSync)

Ejemplo

fs.appendFileSync('log.txt', 'Nuevo contenido de registro\n');

Adición asíncrona (appendFile)

Ejemplo

fs.appendFile('log.txt', 'Nuevo contenido de registro\n', (err) => {
  if (err) throw err;
});

4. Verificación del estado del archivo (stat)

Ejemplo

fs.stat('example.txt', (err, stats) => {
  if (err) throw err;
  console.log(`Tamaño del archivo: ${stats.size} bytes`);
  console.log(`Fecha de creación: ${stats.birthtime}`);
  console.log(`Si es un archivo: ${stats.isFile()}`);
  console.log(`Si es un directorio: ${stats.isDirectory()}`);
});

5. Eliminación de archivos

Eliminación síncrona (unlinkSync)

Ejemplo

fs.unlinkSync('fileToDelete.txt');

Eliminación asíncrona (unlink)

Ejemplo

fs.unlink('fileToDelete.txt', (err) => {
  if (err) throw err;
  console.log('Archivo eliminado');
});

Soporte de Promise y async/await

Node.js 10+ proporciona el módulo fs/promises, que admite una API basada en Promise:

Ejemplo

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

async function readFile() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error('Error al leer el archivo:', err);
  }
}

readFile();

Operaciones de archivos con flujos (streams)

Para archivos grandes, el uso de flujos (Stream) puede mejorar el rendimiento:

Flujo de lectura (read stream)

Ejemplo

const readStream = fs.createReadStream('largeFile.txt', 'utf8');

readStream.on('data', (chunk) => {
  console.log('Datos recibidos:', chunk.length);
});

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

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

Flujo de escritura (write stream)

Ejemplo

const writeStream = fs.createWriteStream('output.txt');

writeStream.write('Primera línea de datos\n');
writeStream.write('Segunda línea de datos\n');
writeStream.end('Última línea de datos');

writeStream.on('finish', () => {
  console.log('Escritura completada');
});

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

Operaciones de directorios

Crear directorios

Ejemplo

fs.mkdir('newFolder', (err) => {
  if (err) throw err;
  console.log('Directorio creado');
});

Leer contenido de un directorio

Ejemplo

fs.readdir('./', (err, files) => {
  if (err) throw err;
  console.log('Contenido del directorio actual:', files);
});

Eliminar directorios

Ejemplo

fs.rmdir('emptyFolder', (err) => {
  if (err) throw err;
  console.log('Directorio eliminado');
});

Buenas prácticas

  1. Prioriza el uso de métodos asíncronos: evita bloquear el bucle de eventos (event loop)
  2. Manejo de errores: maneja siempre los posibles errores
  3. Usa flujos para procesar archivos grandes: mejora el rendimiento
  4. Manejo de rutas: usa el módulo path para manejar problemas de rutas entre plataformas
  5. Verificación de permisos: verifica los permisos de archivos/directorios antes de operar

Ejemplos de aplicaciones prácticas

Función de copia de archivos

Ejemplo

const fs = require('fs');

function copyFile(source, target, cb) {
  const readStream = fs.createReadStream(source);
  const writeStream = fs.createWriteStream(target);

  readStream.on('error', cb);
  writeStream.on('error', cb);
 
  readStream.on('close', () => {
    writeStream.end();
    cb(null);
  });
 
  readStream.pipe(writeStream);
}

copyFile('source.txt', 'target.txt', (err) => {
  if (err) return console.error('Error al copiar:', err);
  console.log('Archivo copiado con éxito');
});

Java FileMódulos integrados de Node.js

Otras extensiones