我正在尝试在解压缩时读取gzip压缩文件的一部分,这样我就可以解析头部内容而无需读取不必要的字节.我之前使用过这个工作,fs.read()同时传递选项只读取前500个字节,然后zlib.gunzip()在从二进制数据解析头部之前使用解压缩内容.
这个工作正常,直到节点v5.0.0修补了一个错误,以确保zlib在截断的输入上引发错误(https://github.com/nodejs/node/pull/2595).
现在我从zlib收到以下错误.
Error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)
如何知道我在截断输入而不抛出错误的情况下解压缩这个部分文件.我认为使用流可能更容易,所以我写了以下内容.
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');
});
Run Code Online (Sandbox Code Playgroud)
我的parseBinaryHeader()函数返回正确的标题内容,所以我知道它是解压缩但它仍然在输入结束时抛出错误.我可以添加错误监听器来处理错误,并且不做任何事情,但这似乎并不理想.
有任何想法吗?
感谢所有的建议.我还向节点存储库提交了一个问题,并获得了一些很好的反馈.这是最终为我工作的东西.
例
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);
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,这一直在工作,并且允许我继续处理所有其他gunzip错误,因为pause()阻止解压缩流抛出"意外的文件结束"错误.
| 归档时间: |
|
| 查看次数: |
10870 次 |
| 最近记录: |