web-dev-qa-db-ja.com

JavaScriptでフォルダーとファイルのリストを取得する最良の方法

Node-webkitを使用しており、ユーザーにフォルダーを選択させようとしています。そのフォルダーのディレクトリ構造を返し、その子を再帰的に取得します。

私はこれをこのコードでかなり簡単に動作させています(Angular Controller))。

 var fs = require( 'fs'); 
 
 $ scope.Explorer = []; 
 $ scope.openFile = function(){
 $ scope.Explorer = [tree_entry($ scope.path)]; 
 get_folder($ scope.path、$ scope.Explorer [0] .children); 
}; 
 
 function get_folder(path、tree){
 fs.readdir(path、function(err、files){
 if(err)return console.log(err); 
 
 files.forEach(function(file 、idx){
 tree.Push(tree_entry(file)); 
 fs.lstat(path + '/' + file、function(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:[]} 
} 

22個の子フォルダーと約4レベルの深さを持つ中程度のサイズのフォルダーを取得すると、ディレクトリ構造全体を取得するのに数分かかります。

ここで明らかに間違っていることはありますか?組み込みのNode fsメソッドを使用しているので、それほど時間がかかるとは信じられません。または、すべてに触れずにディレクトリのコンテンツ全体を取得する方法はありますかファイル?

ツリー全体のファイル名、およびおそらくコンテンツに対してもAngularフィルターを使用できるようにしたいので、ツリー全体の処理を遅らせることはできませんおそらく動作するソリューション。

22
pedalpete

私のプロジェクトでは、この関数を使用して大量のファイルを取得します。それは非常に高速です(require("FS")を出力してさらに高速化する):

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;

};

使用法は明確です:

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

なぜ車輪を発明するのですか?

非常に人気のあるNPMパッケージがあり、そのようなことを簡単に行うことができます。

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

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

さらに詳しく: