DEV Community

Cover image for ¿Cómo leer todos los archivos de un directorio con Node?
Matías Hernández Arellano
Matías Hernández Arellano

Posted on • Originally published at matiashernandez.dev

¿Cómo leer todos los archivos de un directorio con Node?

Una tarea común en una aplicación en un servidor es obtener un listado de archivos que existen dentro de algún directorio para después realizar alguna tarea con ellos.

Nodejs ofrece una API que permite trabajar con archivos incluyendo la posibilidad de leer el contenido de un directorio de forma síncrona y asíncrona (con callbacks o promesas).

/* Leer el contenido de un directorio de forma sincrona */

// files es un arreglo con los nombres de los archivos dentro del directorio
import fs from 'node:fs'
const files = fs.readdirSync('./mi-directorio') 



/* Leer el contenido de un directorio de forma asincrona usando callbacks*/
import fs from 'node:fs'
let files = []
fs.readdir('./mi-directorio',(err, result) => {
  if(err) {
    console.error(err)
    throw Error(err)
  }
  files = result
}) 


/* Leer el contenido de un directorio de forma asincrona usando promesas*/
import fs from 'node:fs'

const files = await fs.promises.readdir('./mi-directorio')
Enter fullscreen mode Exit fullscreen mode

Pero esto solo retornará la lista de archivos y directorios del "primer nivel", es decir, si tienes un estructura de directorio como:

undefined

El resultado será:

[
  'node_modules',
  'public',
  'src',
  '.gitignore',
  'package.json',
  'README.md'
]
Enter fullscreen mode Exit fullscreen mode

¿Cómo obtener todos los archivos incluyendo los sub-directorios?

Recursión es la respuesta:

async function readAllFiles(path, arrayOfFiles = []){
    const files = fs.readdirSync(path)
    files.forEach(file => {
        const stat = fs.statSync(`${path}/${file}`)
        if(stat.isDirectory()){
            readAllFiles(`${path}/${file}`, arrayOfFiles)
        }else{
            arrayOfFiles.push(`${path}/${file}`)
        }
    }
    )
    return arrayOfFiles
}
Enter fullscreen mode Exit fullscreen mode

La función de arriba realiza la lectura del contenido de un directorio


const file = fs.readdirSync(path)

Enter fullscreen mode Exit fullscreen mode

Luego, para cada uno de los elementos del arreglo retornado files.forEach revisa si dicho elemento es o no un directorio


const stat = fs.statSync(`${path}/${file}`)

if(stat.isDirectory())

Enter fullscreen mode Exit fullscreen mode

En caso de ser un directorio, realiza una llamada recursiva, cambiando el primer argumento para que sea el actual directorio.


readAllFiles(`${path}/${file}`, arrayOfFiles)

Enter fullscreen mode Exit fullscreen mode

En caso contrario, simplemente almacena en el arreglo arrayOfFiles el archivo.

Así, el resultado de leer la estructura de directorios anterior el resultado será


[  
    ................  
    'public/favicon.ico',

    'public/index.html,

    'public/robots.txt',  
    'src/index.css',

    'src/index.js',  
    '.gitignore',  
    'package.json',  
    'README.md'  
]

Enter fullscreen mode Exit fullscreen mode

Footer Social Card.jpg
✉️ Únete a Micro-bytes 🐦 Sígueme en Twitter ❤️ Apoya mi trabajo

Top comments (0)