Обход каталога с помощью Node.js

У меня проблема с этим кодом в node.js. Я хочу рекурсивно пройтись по дереву каталогов и применить действие обратного вызова к каждому файлу в дереве. На данный момент это мой код:

var fs = require("fs");

// General function
var dive = function (dir, action) {
  // Assert that it's a function
  if (typeof action !== "function")
    action = function (error, file) { };

  // Read the directory
  fs.readdir(dir, function (err, list) {
    // Return the error if something went wrong
    if (err)
      return action(err);

    // For every file in the list
    list.forEach(function (file) {
      // Full path of that file
      path = dir + "/" + file;
      // Get the file's stats
      fs.stat(path, function (err, stat) {
        console.log(stat);
        // If the file is a directory
        if (stat && stat.isDirectory())
          // Dive into the directory
          dive(path, action);
        else
          // Call the action
          action(null, path);
      });
    });
  });
};

Проблема в том, что в для каждого цикла stat вызывается для каждого файла через переменную path . Когда вызывается обратный вызов, путь уже имеет другое значение, поэтому он погружает в неправильные каталоги или вызывает действие для неправильных файлов.

Вероятно, эту проблему можно было бы легко решить, используя fs.statSync , но я бы предпочел не это решение, поскольку оно блокирует процесс.

18
задан tshepang 9 April 2014 в 00:40
поделиться