如何用Node.js遍历目录?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (345)

我在node.js中遇到了这个代码的问题。我想递归遍历目录树并将回调应用action到树中的每个文件。这是我目前的代码:

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。当回调被调用时,path已经有了另一个值,所以它进入了错误的目录或者调用action了错误的文件。

可能这个问题很容易通过使用fs.statSync得到解决,但这不是我想要的解决方案,因为它阻止了这个过程。

提问于
用户回答回答于

var path = dir + "/" + file;

你忘了做path一个局部变量。现在它不会在循环后面改变。

用户回答回答于

为此使用node-dir。因为你需要对目录和文件进行单独的操作,所以我会给你2个使用node-dir的简单迭代器。

异步迭代目录及其子目录的文件,并将文件路径数组传递给回调函数。

var dir = require('node-dir');

dir.files(__dirname, function(err, files) {
  if (err) throw err;
  console.log(files);
  //we have an array of files now, so now we'll iterate that array
  files.forEach(function(filepath) {
    actionOnFile(null, filepath);
  })
});

异步迭代目录及其子目录的子目录,并将目录路径数组传递给回调。

var dir = require('node-dir');

dir.subdirs(__dirname, function(err, subdirs) {
  if (err) throw err;
  console.log(subdirs);
  //we have an array of subdirs now, so now we'll iterate that array
  subdirs.forEach(function(filepath) {
    actionOnDir(null, filepath);
  })
});

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动