fs, es la abreviatura en ingles para file system o sistema de archivos, y es, ademas, uno de los módulos más básicos y útiles de Node. En este artículo, repasaremos algunos de los métodos más importantes y útiles para manipular el sistema de archivos.

Necesitará tener instalado primero Node.js, por supuesto. Puedes hacer eso aquí. Afortunadamente para nosotros, fs es uno de los módulos que vienen con Node.

Simplemente hay que hacer referencia a el:

const fs = require('fs');

Síncrono vs Asíncrono

Cada método fs tiene una versión síncrona y otra asíncrona y la convención es que el nombre de la forma síncrona que acaba con Sync. Entonces, un fs.writeFile() asíncrono se convierte en fs.writeFileSync(). Por supuesto, el código síncrono detendrá la ejecución posterior del código cuando se produzca un error, pero es más fácil entenderlo. Para todos los ejemplos de este artículo, usaremos sus formas síncronas.

Operaciones básicas

Las operaciones básicas de CRUD (crear, leer, actualizar y eliminar) son muy simples de hacer con solo 3 funciones principales.

  • fs.writeFileSync()
  • fs.readFileSync()
  • fs.unlinkSync()

fs.writeFileSync()

fs.writeFileSync() solo toma dos argumentos; la ruta a la ubicación del nuevo archivo, que debe terminar con el nombre del nuevo archivo y los datos que desea almacenar.

const gatos = [{
  type: 'leon'
}];

fs.writeFileSync('./gatos.json', JSON.stringify(gatos));

Tenga en cuenta que fs.writeFileSync() está reescribiendo completamente el contenido en gatos.json, por lo que si cambia el tipo: ‘leon’ para escribir: ‘tigre’ y vuelva a ejecutar el archivo, se reemplazará a leon. Esto puede tener importantes inconvenientes de rendimiento al modificar archivos grandes.

fs.readFileSync()

De forma predeterminada, todos los datos se devuelven como un “búfer”, una cadena de números codificada especial, para solucionar este problema, simplemente pase “utf8” como segundo argumento.

Aquí vamos a devolver una matriz vacía si gatos.json está vacío y devolverá los datos si existen.

const gatos = [{
    type: 'leon'
}];


const getData = () => {
  let data = fs.readFileSync('./gatos.json', 'utf8');

  if (!data) return [];
  else {
    const file = JSON.parse(data);
    return file;
  }
}

const data = getData();

En donde data, tendrá el json que acabamos de leer.

fs.unlinkSync()

Unlink es el más sencillo de los tres, solo requiere la ruta al archivo o enlace simbólico que desea eliminar.

fs.unlinkSync('./gatos.json');

Operaciones de CRUD en directorios

Los tres métodos anteriores tienen sus propias contrapartes útiles para manipular directorios por sí mismos.

  • fs.mkdirSync()
  • fs.rmdirSync()
  • fs.readdirSync()

Dado que el uso de fs.mkdirSync() y fs.readdirSync() son los mismos que sus contrapartes de archivo, terminaremos trabajando en los errores que vienen con fs.rmdirSync() en su lugar.

rimraf vs fs.rmdirSync()

El principal problema con el uso de fs.rmdirSync() para eliminar carpetas es el hecho de que solo funcionará en directorios vacíos. Si el directorio no esta vació, se verá este error:

Error: ENOTEMPTY: directory not empty, rmdir './directorio'

que obviamente no es lo que queremos. Lamentablemente, Node no tiene una solución nativa para esto, por alguna razón, así que tendremos que buscar en otra parte.

La solución más simple que he encontrado ha sido un paquete npm llamado rimraf, así que instalemos eso rápidamente.

npm i rimraf

La sintaxis es muy similar, excepto que en lugar de fs se llama rimraf.sync () (o rimraf() para la versión asíncrona) y se pasa en su ruta como cabría esperar.

const rimraf = require('rimraf');

rimraf.sync('./directorio');