SORU
29 NİSAN 2011, Cuma


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
29 NİSAN 2011, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jkimisyellow...ish

    jkimisyellow

    8 Temmuz 2009
  • K-391

    K-391

    23 EKİM 2012
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011