node.js fs.readdir recursive dizin arama
Zaman uyumsuz bir dizin arama fs kullanma hakkında herhangi bir fikir.readdir? Özyineleme tanıtmak ve okuma dizini işlevini çağırın okumak için bir sonraki dizini ile yapabiliriz bunun farkındayım, ama uyumsuz olmadığı konusunda biraz endişeliyim...
Herhangi bir fikir? Harika node-walk baktım, ama doğru olanı readdir yaptığı gibi beni Bir dizide sadece dosyaları ver. Rağmen
Gibi çıkış arıyor
['file1.txt', 'file2.txt', 'dir/file3.txt']
CEVAP
Temelde bunun üstesinden gelmenin iki yolu vardır. Döngüler iki çeşit olduğunu fark edeceksiniz zaman uyumsuz bir ortamda: seri ve paralel. Seri bir döngü sonraki yineleme üzerine hareket etmeden önce bir yineleme için tamamlamak için bekler - bu döngünün her yineleme sırada tamamlayan garanti eder. Paralel bir döngü tüm yinelemelerini aynı anda başladı, ve, ancak, çok daha hızlı seri bir döngü daha önce başka bir hızlandırıcı olabilir. Yani bu durumda, muhtemelen daha iyi kullanın paralel bir döngü çünkü önemli değil ne sipariş yürüyüş tamamlar, ne kadar zamanda tamamlar ve döner sonuçları (istiyorsan onları sırayla).
Paralel bir döngü bu gibi görünecektir:
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);
}
});
});
});
};
Seri bir döngü bu gibi görünecektir:
var fs = require('fs');
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 = 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();
}
});
})();
});
};
Ve bu ev üzerinde test için dizin (UYARI: ev dizininizde malzeme listesi eğer bir sürü varsa, bu çok büyük olacak sonuçları):
walk(process.env.HOME, function(err, results) {
if (err) throw err;
console.log(results);
});
EDİT: Gelişmiş örnekler.
Nasıl dizin özelliği etkinleştirmek iç...
Arama, birden çok dizin farklı veri se...
Node.js - eve platform bağımsız şekild...
Dizin arama yapabilirsiniz.() GetFiles...
Eğer dosya/dizin node.js varsa eşzaman...