在Node.js中,fs.createFileStream生成的stream在另一个stream被读取到结尾之后是不可读的

我正在使用node-zipstream在node.js中创buildZIP文件。 我已经创build了一个简单的包装来创build一个同步API的错觉,当添加stream到ZIP(包含在下面的代码中)。

当使用请求stream时,一切都按预期工作,但是当我使用文件stream时,第一个stream完成后第二个stream变得不可读。

var zipstream = require('zipstream'); var fs = require('fs'); function ZipQueue(out, options) { var zip = zipstream.createZip(options); zip.pipe(out); var queue = new Array(); this.addFile = function(readStream, options) { queue.push({stream: readStream, options: options}); } this.runQueue = function(cb) { for(var element in queue) { queue[element].stream.on('error', function(err) { console.dir(err); }) } function run() { i++; if (queue.length > i) { console.log("Queue:"); console.dir(queue); console.log("\n"); zip.addFile(queue[i].stream, queue[i].options, run); } else { zip.finalize(cb); } } var i = -1; run(); } } var out = fs.createWriteStream('out.zip'); var q = new ZipQueue(out, { level: 1 }); q.addFile(fs.createReadStream("1.txt"), { name: 'files/1.txt' }); q.addFile(fs.createReadStream("2.txt"), { name: 'files/2.txt' }); q.runQueue(function(written) { console.log(written + ' total bytes written'); }); 

控制台输出:

 >node zip.js Queue: [ { stream: { path: '1.txt', fd: null, readable: true, paused: false, flags: 'r', mode: 438, bufferSize: 65536, _events: [Object] }, options: { name: 'files/1.txt' } }, { stream: { path: '2.txt', fd: null, readable: true, paused: false, flags: 'r', mode: 438, bufferSize: 65536, _events: [Object] }, options: { name: 'files/2.txt' } } ] Queue: [ { stream: { path: '1.txt', fd: 4, readable: false, paused: false, flags: 'r', mode: 438, bufferSize: 65536, _events: [Object], reading: false }, options: { name: 'files/1.txt', version: 20, bitflag: 8, method: 8, moddate: 1098783117, offset: 0, crc32: -137262718, compressed: 7, uncompressed: 5 } }, { stream: { path: '2.txt', fd: 5, readable: false, paused: false, flags: 'r', mode: 438, bufferSize: 65536, _events: [Object], reading: false }, options: { name: 'files/2.txt' } } ]