gpt4 book ai didi

node.js - GUNzipping 部分文件时如何避免 zlib "unexpected end of file"?

转载 作者:搜寻专家 更新时间:2023-10-31 22:24:04 33 4
gpt4 key购买 nike

我试图在解压缩时读取 gzip 文件的一部分,这样我就可以在不读取不必要的字节的情况下解析 header 内容。我以前使用 fs.read() 进行过此工作,同时传递选项以仅读取前 500 个字节,然后使用 zlib.gunzip() 在解析 header 之前解压缩内容从二进制数据。

在 node v5.0.0 修补了一个错误以确保 zlib 在截断的输入 (https://github.com/nodejs/node/pull/2595) 上抛出错误之前,这一直运行良好。

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

Error: unexpected end of file

我如何解压缩这个部分文件,知道我正在截断输入而不抛出错误。我在想使用流可能会更容易,所以我写了以下内容。

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() 函数正在返回正确的 header 内容,所以我知道它正在解压缩,但是当它到达输入末尾时仍然会抛出错误。我可以添加错误监听器来处理错误而不对其执行任何操作,但这似乎并不理想。

有什么想法吗?

最佳答案

感谢所有建议。我还向 Node 存储库提交了一个问题并得到了一些很好的反馈。这就是最终对我有用的东西。

  • 将 block 大小设置为完整 header 大小。
  • 将单个 block 写入解压缩流并立即暂停流。
  • 处理解压后的 block 。

例子

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 错误,因为 pause() 可防止解压缩流抛出“文件意外结束”错误。

关于node.js - GUNzipping 部分文件时如何避免 zlib "unexpected end of file"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33926969/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com