2015-04-17 55 views
0

所以我有一个文件名数组。管道multipe文件到一个流

我需要通过每一个,阅读它作为一个流,逐一管道到最后一个流。

错误地的代码看起来是这样的:

var files = ['file1.txt', 'file2.txt', 'file3.txt']; 
var finalStream = fs.createReadStream()//throws(i need a file path here) 
(function pipeSingleFile(file){ 
    var stream = fs.createReadStream(file); 
    stream.on('end', function(){ 
     if(files.length > 0){ 
     pipeSingleFile(files.shift()); 
     } 
    }); 
    stream.pipe(finalStream); 
})(files.shift()) 

finalStream.pipe(someOtherStream); 
finalStream.on('end', function(){ 
    //all the contents were piped to outside 
}); 

反正有没有做到这一点?

+0

首先,你finalStream应该是一个writeStream(所以'fs.createWriteStream()') – Kerstomaat

+0

感谢,但fs.createWriteStream还需要一个文件名 –

+0

好,然后给它一个;) – Kerstomaat

回答

0

我没有测试你提出的递归解决方案,但它可能无法正常工作,因为你修改原始files阵列(主叫files.shift())在每次迭代两次:它传递给你的功能,并且还内部时。这里是我的建议:

var files = ['file1.txt', 'file2.txt', 'file3.txt']; 

var writableStream = fs.createWriteStream('output.txt'); 

function pipeNext (files, destination) { 
    if (files.length === 0) { 
     destination.end(); 

     console.log('Done!'); 
    } else { 
     var file = files.shift(); 
     var origin = fs.createReadStream(file); 

     origin.once('end', function() { 
      pipeNext(files, destination); 
     }); 
     origin.pipe(destination, { end: false }); 

     console.log('piping file ' + file); 
    } 
} 

pipeNext(files, writableStream); 

我用一个文件只是作为一个例子Writable流,但你可以使用任何你想要的。您可以将此逻辑封装到另一个函数中,并将您的Writable流传递给它。