2014-12-29 3 views
0

fs API를 사용하여 디렉토리 트리에서 파일을 읽는 NodeJS 애플리케이션이 있습니다. 나는 fs-walk 모듈을 사용하여 트리를 걸어갔습니다. 마주 치는 모든 하위 디렉토리에 대해 동일한 기능이 다시 실행되어 처리됩니다. (나는 이것이 재귀라고 생각하지 않고 오히려 동일한 함수가 디렉토리가 처리 될 때마다 발생하는 이벤트에 묶여있다.) 파일은 다른 함수에 의해 처리된다.NodeJS fs API : 비동기 완료 검출

동기 또는 차단 코드를 사용하지 않고 모든 파일을 읽은 후 임의의 코드를 실행하고 싶습니다. 디렉터리 (예를 들어 카운트 다운)의 파일 수를 추적 할 수있는 방법을 찾지 못했고 fs.stat의 특성을 찾을 수 없기 때문에 전체 작업이 완료되었음을 나타냅니다.

누구나 아직이 작업을 수행 한 방법을 찾지 못했습니까? 노드 문서 나 스택 오버 플로우에서 아무것도 찾을 수 없습니다.

+0

내 모듈에 이런 짓을했습니다 그것을 확인, https://github.com/micnic/simpleS/blob/master/lib/cache.js,이 디렉토리 트리를 통과의 캐시 디렉토리 및 파일에 저장하고 통계를 저장하며 변경 사항을 확인합니다. – micnic

답변

0

fs-walk 라이브러리를 조금 더 자세히 살펴본 후에 walk() 메서드의 세 번째 인수는 실제로 final callback입니다. 내부적으로 그들은 async 라이브러리, 특히 async.whilst()async.waterfall() 메서드를 사용하며 모든 것이 완료되면 최종 콜백을 실행합니다.

라이브러리 작성자의 의도는 모든 비동기 작업이 완료 될 때 최종 콜백이 실행되는 것이라고 생각합니다. 당신이 할 수 있어야한다, 코드에 따르면

: 그 작동하지 않는 경우, 당신은 그것을 위해 file an issue in Github 할 수 있습니다

var walk = require('fs-walk'; 

walk('/some/dir', someFileOrDirHandler, function(err) { 
    // This should be a final callback, if the first argument is present, 
    // then there was an error 
    if (err) { 
     /* handle it */ 
     return; 
    } 

    // Getting here indicates success 
}); 
+0

예.하지만 마지막으로 읽어야 할 파일이 무엇인지 모를 것이므로 최종 콜백 함수를 너무 빨리 끝낼 수 있습니다. 이것은 여러 디렉토리를 비동기 적으로 처리하기 때문입니다. –

+0

아,하지만 첫 번째 인수로'walk()'메서드에 배열 배열을 전달할 수 있습니까? 그게 당신의 문제를 해결합니까? – jakerella

+0

x 개의 중첩 된 디렉토리가 있기 때문에 불행히도 아닙니다. 왜 nodejs 'fs API가 주어진 디렉토리에 대한 "자식"수를 제공하지 않는 것은 불행한 일입니다. ( –

0

을 성능에서 타협, 나는 총을하고 결국 파일 시스템을 동 기적으로 액세스하는 재귀 함수를 사용하여 파일 수를 계산합니다. 합계를 사용하여 모든 파일을 비동기 적으로 액세스하여 매번 누계를 감소시킵니다. 총계가 0에 도달하면 완료된 모든 데이터를 처리하는 함수를 실행했습니다.

var countAllFiles = new Promise(function (resolve, reject) { 
    var total = 0, 
    count = function (path) { 
     var contents = fs.readdirSync(path), file, name; 
     for (file in contents) { 
      if (!contents.hasOwnProperty(file)) continue; 
      name = path + '/' + contents[file]; 
      if (fs.statSync(name).isDirectory()) 
       count(name); 
      else 
       ++total; 
     } 
    }; 
    count('/path/to/tree/'); 
    resolve(total); 
}).then(function (total) { 
    walk.dirs('/path/to/tree/', handlerFunction, errorHandler); 
    // for every file, decrement total. Then, if it's zero, execute the code that 
    // depends on all the read/write operations being complete 
});