所以我有一个文件名数组。
我需要遍历其中的每一个,将其作为流阅读,逐个管道到最终流。
错误地,代码看起来像这样:
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
});
有没有办法做到这一点?
我没有测试您提出的递归解决方案,但它可能不起作用,因为您在每次迭代中修改原始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
流传递给该函数。