2012-07-03 4 views
2

ReadLine을 사용하여 매우 큰 파일을 한 줄씩 읽으므로 여러 개의 다른 파일로 의미있는 조각으로 나눌 수있는 장소를 감지 할 수 있습니다. WriteStream을 사용하여 해당 파일에 기록합니다. 정규 표현식이 컷의 장소를 검출하면, 현재 열려있는 WriteStream를 종료 해, 방금 읽은 행의 새로운 행을 엽니 다. 문제는 end() 호출이 작업을 수행하지 않는 것처럼 모든 파일이 잘리는 것입니다.스트림에 쓰기가 오버플로됩니다.

write()의 성공 여부를 검사하고 버퍼가 가득 차면 입력 스트림을 일시 중지합니다. 내가에서는 ReadLine의 입력 스트림을 puase 나는 그것을 다시 할 때 '드레인'이벤트를 수신, 나는 (쓰기를 찾을 때)

var rl = readline.createInterface({ 
    input: fs.createReadStream('basesystem.js',{encoding:'utf8'}), 
    output: process.stdout 
}); 
rl.on('line', function (line) { 
    var match = rexp.exec(line); 
    if (match) { 
     out.end(); 
     console.log(path.join(PATH, match[2],'.js')); 
     out = fs.createWriteStream(path.join(PATH,match[2]) + '.js', {encoding:'utf8'}); 

    } 
    if (!out.write(line + '\n')) { 
     console.log('***** paused **** '); 
     rl.pause(); 
     out.once('drain', function() { 
      console.log('***** resume **** '); 
      rl.resume(); 
     }); 
    } 
}); 

실패 :이 내 코드의 관련 부분이다. 나는 '유출'영구적 인 청취자를 떠나려고했지만 ReadLine의 라인이 계속오고있는 것 같습니다. 모든 파일이 잘립니다. ReadLine은 일시 중지 된 경우에도 '회선'이벤트 전송을 중지하지 않는 것 같습니다.

이 샘플보다 먼저 WriteStream이 생성되고 ReadLine 스트림에서 'close'이벤트를 수신하여 최종 파일을 종료 (end)하지만 어쨌든 마지막 파일뿐 아니라 모든 파일이 잘립니다. .

디스플레이

보여줍니다 모든 ** 라인을 따라 콘솔에 징후를 읽을 * 일시 정지하지만 이력서 . 모든 이력서 ** 줄 끝이 한 번에 모두옵니다.

미리 감사드립니다.

답변

2

ReadLine의 잘못입니다. ReadLine이 pause()를 받으면 자체 입력 스트림을 일시 중지하지만 버퍼에 이미 행이 분할되어 있으면 이전 버퍼에서 이미 분리 된 각 행에 대해 'line'이벤트를 계속 출력합니다. 해당 행 배열이 완료되면 중지됩니다. 노드의 사이트에 버그 보고서를 제출했습니다.

관련 문제