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

  • Abbeydabby0277's channel

    Abbeydabby02

    9 ŞUBAT 2012
  • Absolute Zero(Programming Tutorials)

    Absolute Zer

    22 Kasım 2012
  • echifitness

    echifitness

    9 Kasım 2008