web-dev-qa-db-fra.com

meilleure façon d'obtenir la liste des dossiers et des fichiers en Javascript

J'utilise node-webkit, et j'essaie qu'un utilisateur sélectionne un dossier, et je vais retourner la structure de répertoire de ce dossier et récupérer récursivement ses enfants.

J'ai ce travail assez simplement avec ce code (dans un Angular Controller).

 var fs = require ('fs'); 
 
 $ scope.Explorer = []; 
 $ scope.openFile = function () {
 $ scope.Explorer = [entrée_arbre ($ scope.path)]; 
 get_folder ($ scope.path, $ scope.Explorer [0] .children); 
}; 
 
 function get_folder (path, tree) {
 fs.readdir (chemin, fonction (err, fichiers) {
 if (err) return console.log (err); 
 
 files.forEach (function (file , idx) {
 tree.Push (tree_entry (fichier)); 
 fs.lstat (chemin + '/' + fichier, fonction (err, stats) {
 if (err ) return console.log (err); 
 if (stats.isDirectory ()) {
 get_folder (path + '/' + file, tree [idx] .children); 
 } 
}); 
}); 
}); 
 console.log ($ scope.Explorer); 
 
 return; 
} 
 
 function tree_entry (entry) {
 return {label: entry, children: []} 
} 

Prenant un dossier de taille moyenne avec 22 dossiers enfants et environ 4 niveaux de profondeur, il faut quelques minutes pour obtenir la structure complète du répertoire.

Y a-t-il évidemment quelque chose que je fais mal ici? Je ne peux pas croire que cela prenne autant de temps, car j'utilise les méthodes intégrées Node fs. Ou existe-t-il un moyen d'obtenir tout le contenu d'un répertoire sans toucher à chaque fichier?

Je vais vouloir pouvoir utiliser un filtre Angular sur les noms de fichiers tout au long de l'arborescence, et peut-être aussi sur le contenu, donc retarder le traitement de l'arborescence entière n'est pas probablement une solution qui fonctionnerait.

22
pedalpete

Dans mon projet, j'utilise cette fonction pour obtenir une énorme quantité de fichiers. C'est assez rapide (mettez require("FS") pour le rendre encore plus rapide):

var _getAllFilesFromFolder = function(dir) {

    var filesystem = require("fs");
    var results = [];

    filesystem.readdirSync(dir).forEach(function(file) {

        file = dir+'/'+file;
        var stat = filesystem.statSync(file);

        if (stat && stat.isDirectory()) {
            results = results.concat(_getAllFilesFromFolder(file))
        } else results.Push(file);

    });

    return results;

};

l'utilisation est claire:

_getAllFilesFromFolder(__dirname + "folder");
41
Samuel Ondrek

Pourquoi inventer la roue?

Il existe un package NPM très populaire, qui vous permet de faire des choses aussi simples.

var recursive = require("recursive-readdir");

recursive("some/path", function (err, files) {
  // `files` is an array of file paths
  console.log(files);
});

En savoir plus:

0