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

  • 365multimedia

    365multimedi

    26 ŞUBAT 2009
  • bashirsultani

    bashirsultan

    22 Mart 2010
  • CNNMoney

    CNNMoney

    16 Kasım 2006