Node.js recursivamente lista la ruta completa de archivos

Buenas noches a todos. Estoy teniendo problemas con probablemente alguna función recursiva simple. El problema es enumerar recursivamente todos los archivos en una carpeta determinada.

Por el momento, he logrado enumerar los archivos en un directorio usando una función simple:

fs.readdirSync(copyFrom).forEach(file => { let fullPath = path.join(copyFrom, file); if (fs.lstatSync(fullPath).isDirectory()) { console.log(fullPath); } else { console.log(fullPath); } }); 

He intentado varios métodos como do{} ... while() pero no puedo hacerlo bien.
Como soy un principiante en javascript, finalmente decidí pedirles ayuda.

Gracias de antemano por su preciosa ayuda.

Solo agrega una llamada recursiva y listo:

  function traverseDir(dir) { fs.readdirSync(dir).forEach(file => { let fullPath = path.join(dir, file); if (fs.lstatSync(fullPath).isDirectory()) { console.log(fullPath); traverseDir(fullPath); } else { console.log(fullPath); } }); } 

El uso de console.log de esta manera muestra la ruta y eso es genial, pero ¿qué pasa si quieres hacer algo más significativo con las rutas? Por ejemplo, tal vez desee recostackrlos todos en una matriz y pasarlos a otro lugar para procesarlos …

Este proceso de comenzar con un estado semilla y expandir una secuencia de valores mientras el estado cambia se llama unfold .

 const { join } = require ('path') const { readdirSync, statSync } = require ('fs') const unfold = (f, initState) => f ( (value, nextState) => [ value, ...unfold (f, nextState) ] , () => [] , initState ) const None = Symbol () const relativePaths = (path = '.') => readdirSync (path) .map (p => join (path, p)) const traverseDir = (dir) => unfold ( (next, done, [ path = None, ...rest ]) => path === None ? done () : next ( path , statSync (path) .isDirectory () ? relativePaths (path) .concat (rest) : rest ) , relativePaths (dir) ) console.log (traverseDir ('.')) // [ a, a/1, a/1/1, a/2, a/2/1, a/2/2, b, b/1, ... ] 

Si esta es la primera vez que ve un progtwig como este, el unfold se sentirá muy abrumador. A continuación, se muestra un ejemplo simplificado de unfold utilizado para generar una matriz del alphabet minúsculas.

 const unfold = (f, init) => f ( (x, next) => [ x, ...unfold (f, next) ] , () => [] , init ) const nextLetter = c => String.fromCharCode (c.charCodeAt (0) + 1) const alphabet = unfold ( (next, done, c) => c > 'z' ? done () : next ( c // value to add to output , nextLetter (c) // next state ) , 'a' // initial state ) console.log (alphabet) // [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z ]