2012-04-29 2 views
0

글쎄요, 적어도 결과는 예상치 않았습니다. 디렉토리를 검색하고 모든 파일과 하위 폴더를 가져 오려고하지만 서브 디렉토리의 하위 디렉토리로 작업 할 때 문제가 있습니다. 함수 자체는 주어진 폴더 내의 모든 폴더와 모든 파일의 모든 내용을 찾고 폴더 안의 것들 중 하나가 폴더 일 때 스스로를 호출하도록 설계되었습니다.예기치 않은 결과를주는 node.js의 재귀 함수

그러나 결코 끝나지 않으며, 동일한 폴더를 계속 먹여서 절대 아무 것도하지 않고 결국 충돌 만합니다.

var fs = require('fs'); 

var array = fs.readdirSync(__dirname); 
function getAllSub(array){ 
for (i = 0; i < array.length; i++){ 
    if (array[i].indexOf(".") == (-1)) 
     {      
      array = array.concat(array[i] + "/" + fs.readdirSync(__dirname + "/" + array[i])); 
     } 
    if (array[i].indexOf("/") != (-1)){ 
     var foldcon = array[i].substr(array[i].indexOf("/") + 1); 
     var folder = array[i].substr(0, array[i].indexOf("/")); 
     foldcon = foldcon.split(","); 
     for (n = 0; n < foldcon.length; n++){ 
      foldcon[n] = folder + "/" + foldcon[n] 
      if (foldcon[n].indexOf(".") == (-1)){ 
       console.log([foldcon[n]]); 
       foldcon[n] = getAllSub([foldcon[n]]);   

      } 
     } 
     array.splice(i, 1, foldcon); 

    } 

} 


return array; 
} 
array = getAllSub(array); 
console.log(array); 

답변

2

코드에 몇 가지 문제점이 있습니다. fs.stat 호출을 사용하여 파일에 대한 정보를 가져와 디렉토리인지 파일인지 확인하고 경로 자체를 구문 분석하면 실제로 오류가 발생하기 쉽습니다. 또한 readdir은 파일의 전체 경로가 아닌 디렉토리의 파일 이름 만 반환합니다. 마지막으로, 당신이 이것을하는 동안 node.js 스레드를 잠그지 않도록 readdir의 비동기 버전을 사용하는 것이 좋습니다.

다음은 시작 경로에서 모든 폴더와 파일을 얻기위한 몇 가지 예제 코드입니다 :

var parseDirectory = function (startPath) { 
    fs.readdir(startPath, function (err, files) { 
    for(var i = 0, len = files.length; i < len; i++) { 
     checkFile(startPath + '/' + files[i]); 
    } 
    }); 
}; 

var checkFile = function (path) { 
    fs.stat(path, function (err, stats) { 
    if (stats.isFile()) { 
     console.log(path + ' is a file.'); 
    } 
    else if (stats.isDirectory()) { 
     console.log(path + ' is a directory.'); 
     parseDirectory(path); 
    } 
    }); 
}; 


parseDirectory(__dirname + '/../public'); 
+0

아 덕분에, 다시 한번 내가 모든 기능을 알지 못한다. readdir의 동기식 버전을 사용하는 유일한 이유는 서버가 시작되기 전에이 기능의 시작을 가지고 모든 파일과 폴더의 배열을 제공하기 때문입니다. – Hallucigenia95