2014-11-09 5 views
3

Я пытаюсь получить список всех файлов в каталоге (и файлы в подкаталоги) со следующим кодом:NodeJS рекурсивно список файлов в каталоге

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) 

Однако при попытке мой код для вызова walk(file) в строке 8 Я получаю следующую ошибку:

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

Почему не определено? Если у меня есть структура каталогов ниже, не должен ли код идентифицировать aaa.txt и bbb.txt как файлы, my_dir в качестве каталога, в котором он рекурсивно вызывает walk и снова начинает процесс (с zzz.txt, являющимся значением f)?

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

Попробуйте выполнить тестирование на 'e', возможно, произошла ошибка. –

+1

вам также нужно добавить имя_каталог в рекурсивную прогулку. – wayne

ответ

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) 
4

Функция 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); 
     } 
     }); 
    }); 
    }); 
}; 
Смежные вопросы