关于使用fs.readdir进行异步目录搜索的任何想法?我意识到我们可以引入递归并使用下一个目录来调用read目录函数以进行读取,但是我有点担心它不会异步…
有任何想法吗?我看过很棒的node-walk,但是不像readdir那样仅给我数组中的文件。虽然
寻找像…的输出
['file1.txt', 'file2.txt', 'dir/file3.txt']
基本上有两种方法可以实现此目的。在异步环境中,您会注意到有两种循环:串行循环和并行循环。串行循环等待一个迭代完成,然后再移至下一个迭代- 这可确保循环的每个迭代均按顺序完成。在并行循环中,所有迭代都在同一时间开始,一个迭代可能在另一个迭代之前完成,但是它比串行循环快得多。因此,在这种情况下,最好使用并行循环,因为步行完成的顺序无关紧要,只要步行完成并返回结果即可(除非您希望它们按顺序进行)。
并行循环如下所示:
var fs = require('fs'); var path = require('path'); var walk = function(dir, done) { var results = []; fs.readdir(dir, function(err, list) { if (err) return done(err); var pending = list.length; if (!pending) return done(null, results); list.forEach(function(file) { file = path.resolve(dir, file); fs.stat(file, function(err, stat) { if (stat && stat.isDirectory()) { walk(file, function(err, res) { results = results.concat(res); if (!--pending) done(null, results); }); } else { results.push(file); if (!--pending) done(null, results); } }); }); }); };
串行循环如下所示:
var fs = require('fs'); var path = require('path'); var walk = function(dir, done) { var results = []; fs.readdir(dir, function(err, list) { if (err) return done(err); var i = 0; (function next() { var file = list[i++]; if (!file) return done(null, results); file = path.resolve(dir, file); fs.stat(file, function(err, stat) { if (stat && stat.isDirectory()) { walk(file, function(err, res) { results = results.concat(res); next(); }); } else { results.push(file); next(); } }); })(); }); };
并在主目录中对其进行测试(警告:如果主目录中包含很多内容,结果列表将非常庞大):
walk(process.env.HOME, function(err, results) { if (err) throw err; console.log(results); });
编辑:改进的例子。