Node.js liste récursivement le chemin complet des fichiers

Bonne nuit tout le monde. J’ai probablement des problèmes avec une fonction récursive simple. Le problème est de lister de manière récursive tous les fichiers d’un dossier donné.

Pour le moment, j’ai réussi à lister les fichiers dans un répertoire en utilisant une simple fonction:

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

J’ai essayé diverses méthodes comme do{} ... while() mais je ne peux pas le faire correctement.
En tant que débutant en javascript, j’ai finalement décidé de vous demander de l’aide.

Merci d’avance pour votre aide précieuse.

Ajoutez simplement un appel récursif et vous avez terminé:

  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); } }); } 

Utiliser console.log de cette manière affiche le chemin et c’est génial, mais que faire si vous voulez faire quelque chose de plus significatif avec les chemins? Par exemple, vous voudrez peut-être tous les rassembler dans un tableau et les transmettre pour traitement ailleurs …

Ce processus consistant à démarrer avec un état initial et à développer une séquence de valeurs pendant que l’état change est appelé un 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 c’est la première fois que vous voyez un programme comme celui-ci, le unfold semblera très pénible. Ci-dessous, un exemple simplifié de unfold utilisé pour générer un tableau de l’ alphabet minuscule

 const unfold = (f, init) => f ( (x, next) => [ x, ...unfold (f, next) ] , () => [] , init ) const nextLetter = c => Ssortingng.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 ]