2014-09-05 3 views
0

노드를 사용하여 하위 디렉토리를 포함하는 디렉토리에 포함 된 고유 한 파일 이름 목록을 가져오고 각 콜백 결과를 결합하는 데 문제가있었습니다. 난 중복에 대한 작업을 피하고 싶습니다. 어떤 경우에만 fs.stat 콜백에서 파일 이름을 로그하면 어떻게됩니까?Node.js 누적 기가있는 async 디렉토리 트래버스

var distinct = {}; 

function getNames(root) { 
    fs.readdir(root, function(err, list) { 
     list.forEach(function(file) { 
      file = root + '/' + file; 
      fs.stat(file, function(err, stat) { 
       if (!err && stat.isDirectory()) { 
        getNames(file); 
       } else { 
        distinct[path.basename(file)] = true; 
       } 
      }); 
     }); 
    }); 
} 

// perform various operations on unique filename list 
console.log(Object.keys(distinct)); 

물론 이것은 console.log() 함수를 너무 일찍 호출하여 원하지 않는 결과를 가져옵니다. 어떻게하면 작업 할 파일 이름 집합을 얻을 수 있습니까? 비동기 메서드를 사용하여이 작업을 수행하는 좋은 방법이 있습니까? 예 : readdirSyncstatSync을 사용할 필요가 없나요?

+0

팁 하나를'root + '/'+ file' 대신'path.join (root, file)'을 사용하십시오. – naomik

답변

1

비동기 모듈이 여기에 친구가 될 것입니다.

var distinct = {}; 
function getNames(root, callback) { 
    fs.readdir(root, function(err, list) { 
     if (err) return callback(err); 

     async.each(list, function(file, done) { 
      fs.stat(file, function(stat) { 
       if (err) return done(err); 
       if (stat.isDirectory()) return getNames(file, done); 
       distinct[path.basename(file)] = true; 
       done(); 
      }); 
     }, function(err) { 
      // called when all done or error 
      callback(err, distinct); 
     }) 
    }); 
} 

그럼 당신은 내가 promises을 사용하는 것이 좋습니다 수 있음

getNames('path/to/dir', function(distinct) { 
    // logic 
}); 
1

처럼 사용할 수 있습니까?

function getNames(root) { 
    readdir = Q.nfbind(fs.readdir); 
    stat = Q.nfbind(fs.stat); 
    return readdir(root) 
     .then(function(list) { 
      files = []; 
      for(var i = 0; i < list.length; i++) { 
       file = root + '/' + list[i]; 
       files.push(stat(file) 
        .then(function(stat) { 
         if (stat.isDirectory()) { 
          return getNames(file); 
         } else { 
          return path.basename(file); 
         } 
        }) 
       ); 
      } 
      return Q.all(files); 
     }); 
} 
getNames('someDir') 
    .then(console.log) 
    .catch(console.error); 
관련 문제