2

我正在使用node-zipstream在 node.js 中创建 ZIP 文件。在将流添加到 ZIP 时,我创建了一个简单的包装器来创建同步 API 的错觉(包含在下面的代码中)。

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

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' } } ]
4

0 回答 0