2015-04-17 56 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流傳遞給它。