在压缩部分文件时,如何避免zlib“意外结束文件”?

我试图读取压缩文件的一部分,而解压缩它,所以我可以parsing头的内容,而不读取不必要的字节。 我有这个工作以前使用fs.read()传递选项,只读取前500字节,然后使用zlib.gunzip()来解压从二进制数据的头之前的内容。

这工作正常,直到节点v5.0.0修补一个错误,以确保zlib抛出一个截断的input( https://github.com/nodejs/node/pull/2595 )错误。

现在我从zlib得到以下错误。

 Error: unexpected end of file 

我怎样才能解压这个部分文件知道我截断input,而不会引发错误。 我认为这可能会更容易与stream,所以我写了以下内容。

 var readStream = fs.createReadStream(file.path, {start: 0, end: 500}); var gunzip = zlib.createGunzip(); readStream.pipe(gunzip) .on('data', function(chunk) { console.log(parseBinaryHeader(chunk)); console.log('got %d bytes of data', chunk.length); }) .on('error', function (err) { console.log(err); }) .on('end', function() { console.log('end'); }); 

我的parseBinaryHeader()函数返回正确的标题内容,所以我知道它是解压缩,但它仍然在input结束时抛出一个错误。 我可以添加错误侦听器来处理错误,并且无所作为,但这似乎并不理想。

有任何想法吗?

感谢所有的build议。 我还向节点库提交了一个问题,并得到了一些很好的反馈。 这是最后为我工作的。

  • 将块大小设置为完整的标题大小。
  • 将单个块写入解压缩stream,并立即暂停stream。
  • 处理解压缩的块。

 var bytesRead = 500; var decompressStream = zlib.createGunzip() .on('data', function (chunk) { parseHeader(chunk); decompressStream.pause(); }).on('error', function(err) { handleGunzipError(err, file, chunk); }); fs.createReadStream(file.path, {start: 0, end: bytesRead, chunkSize: bytesRead + 1}) .on('data', function (chunk) { decompressStream.write(chunk); }); 

这一直工作到目前为止,还允许我继续处理所有其他gunzip错误,因为暂停()阻止解压缩stream引发“意外的文件结束”错误。