NodeJS以递归方式列出目录中的文件

时间:2014-11-09 12:01:37

标签: javascript node.js

我试图使用以下代码列出目录中的所有文件(以及任何子目录中的文件):

var fs = require('fs')

var walk = function(directoryName) {
  fs.readdir(directoryName, function(e, files) {
    files.forEach(function(file) {
      fs.stat(file, function(e, f) {
        if (f.isDirectory()) {
          walk(file)
        } else {
          console.log('- ' + file)
        }
      })
    })
  })
}

walk(__dirname)

但是,当我的代码尝试在第8行调用walk(file)时,我收到以下错误:

TypeError: Cannot call method 'isDirectory' of undefined
    at program.js:7:15
    at Object.oncomplete (fs.js:107:15)

为什么f未定义?如果我有下面的目录结构,代码不应该将aaa.txtbbb.txt标识为文件,my_dir作为目录,它递归地调用walk并开始再次处理(zzz.txt是f)的值?

- aaa.txt
- bbb.txt
+ my_dir
    - zzz.txt

2 个答案:

答案 0 :(得分:8)

函数fs.readdir列出该目录中的简单文件名,而不是它们的绝对路径。这就是程序找不到它们的原因,从而导致fs.stat中的错误。

以下是解决方案:将目录路径名称连接到文件。

var fs = require('fs');
var path = require('path');

var walk = function(directoryName) {
  fs.readdir(directoryName, function(e, files) {
    if (e) {
      console.log('Error: ', e);
      return;
    }
    files.forEach(function(file) {
      var fullPath = path.join(directoryName,file);
      fs.stat(fullPath, function(e, f) {
        if (e) {
          console.log('Error: ', e);
          return;
        }
        if (f.isDirectory()) {
          walk(fullPath);
        } else {
          console.log('- ' + fullPath);
        }
      });
    });
  });
};

答案 1 :(得分:0)

var fs = require('fs');
var path = require('path');

var walk = function(directoryName) {

  fs.readdir(directoryName, function(e, files) {
    files.forEach(function(file) {
      fs.stat(directoryName + path.sep + file, function(e, f) {

        if (f.isDirectory()) {
          walk(directoryName + path.sep + file)
        } else {
          console.log(' - ' + file)
        }
      })
    })
  })
}

walk(__dirname)