将多个文件传输到单个流

时间:2015-04-17 12:16:37

标签: node.js stream

所以我有一个文件名数组。

我需要仔细阅读每一个内容,将其作为流读取,逐个管道传输到最终流中。

错误地,代码看起来像这样:

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
});

无论如何要实现这个目标吗?

1 个答案:

答案 0 :(得分: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流传递给它。