2015-06-22 86 views
0

例如,给定:'/Users/John/Desktop/FooApp', 我想获得一个列表,例如:NodeJS - 给定目录的完整路径,如何获取所有子目录的列表并检查文件是否存在异步?

['/Users/John/Desktop/FooApp', 
'/Users/John/Desktop/FooApp/Folder1', 
'/Users/John/Desktop/FooApp/Folder2', 
'/Users/John/Desktop/FooApp/Folder2/folderA', 
'/Users/John/Desktop/FooApp/Folder3', 
'/Users/John/Desktop/FooApp/Folder3/folderX', 
'/Users/John/Desktop/FooApp/Folder3/folderX/folderY', 
'/Users/John/Desktop/FooApp/Folder3/folderX/folderY/folderZ', 
'/Users/John/Desktop/FooApp/Folder3/folderX/folderY2' 
] 

我需要这个名单通过所有的搜索目录,以检查文件是否存在。用户输入一个文件夹,我基本上会执行一个类似于操作系统中的发现者的检查。我打算在所有子目录上检查fs.exists(subdir + '/mylib.dll')。有没有干净的方法可以做到这一点?

回答

1

我已将here中的一个类似问题的答案转换为文件而不是目录。我也用async来检查文件是否存在。我还发现fs.exists即将被弃用,并决定继续fs.open

不管怎样,下面是摘录:

var fs = require('fs'); 

var getDirs = function(dir, cb){ 
    var dirs = [dir]; 
    fs.readdir(dir, function(err, list){ 
     if(err) return cb(err); 
     var pending = list.length; 
     if(!pending) return cb(null, dirs); 

     list.forEach(function(subpath){ 
      var subdir = dir + '/' + subpath; 
      fs.stat(subdir, function(err, stat){ 
       if(err) return cb(err); 

       if(stat && stat.isDirectory()){ 
        dirs.push(subdir); 
        getDirs(subdir, function(err, res){ 
         dirs = dirs.concat(res); 
         if(!--pending) cb(null, dirs); 
        }); 
       } else { 
        if(!--pending) cb(null, dirs); 
       } 
      }); 
     }); 
    }); 
}; 

一个可以使用它作为:

var async = require('async'); 

getDirs('/Users/John/Desktop/FooApp', function(err, list){ 
    if(err) return 'Error retrieving sub-directories'; 

    async.detect(list, function(dir, cb){ 
      fs.open(dir + '/mylib.dll', 'r', function(err, file){ 
       if(err) cb(false); 
       else cb(true); 
      }); 
     }, 
     function(dir) { 
      if(!dir) return 'File Not Found'; 
      /* Do something with the found file ... */ 
     } 
    ); 
}); 
相关问题