在Javascript中获取文件夹和文件列表的最佳方式
我正在使用node-webkit,并试图让用户select一个文件夹,然后我将返回该文件夹的目录结构并recursion获取其子项。
我已经很简单的使用这个代码(在一个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); }; 函数get_folder(path,树){ fs.readdir(path,function(err,files){ (err)return console.log(err); files.forEach(function(file,idx){ tree.push(tree_entry(文件)); fs.lstat(path+ '/' +文件,function(ERR,统计数据){ (err)return console.log(err); 如果(stats.isDirectory()){ get_folder(path+ '/' +文件,树[IDX]。儿童); } }); }); }); 的console.log($ scope.explorer); 返回; } 函数tree_entry(entry){ return {label:entry,children:[]} }
以一个中等大小的文件夹与22个子文件夹和大约4级深,需要几分钟来获得整个目录结构。
有什么我明显做错了吗? 我不敢相信这需要很长时间,因为我正在使用内置的Node fs方法。 还是有办法获取目录的全部内容,而不触及每个文件?
我希望能够在文件名称上使用Angularfilter,也可以在内容上使用Angularfilter,所以延迟处理整个树不太可能是一个可行的解决scheme。
在我的项目中,我使用这个function来获取大量的文件。 这很快(把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");