Módulo fs 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
// 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);
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);
});
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');
});
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;
});
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()}`);
});
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');
});
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();
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);
});
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);
});
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');
});
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);
});
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');
});
if (err) throw err;
console.log('Directorio eliminado');
});
Buenas prácticas
- Prioriza el uso de métodos asíncronos: evita bloquear el bucle de eventos (event loop)
- Manejo de errores: maneja siempre los posibles errores
- Usa flujos para procesar archivos grandes: mejora el rendimiento
- Manejo de rutas: usa el módulo path para manejar problemas de rutas entre plataformas
- 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');
});
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');
});
Otras extensiones
Módulos integrados de Node.js