如果我只知道打包数据大小,如何知道TZDecompressionStream的解压缩进度

时间:2013-11-13 12:05:12

标签: delphi stream delphi-2010 zlib compression

我正在使用TZDecompressionStream解压缩压缩数据。 OnProgress: TNotifyEvent中有一个属性TZDecompressionStream,我可以在其中查看我的DecompressionStream的Position属性。它给了我解压缩数据的位置,但我现在没有大小的所有解压缩数据来估计进度。我只知道打包的数据大小。

是否有办法获得输入(解包)数据的位置?

1 个答案:

答案 0 :(得分:2)

TZDecompressionStream.Size给出了解压缩的数据大小,但在开始从流中读取(unpack)之前必须得到此值。如果您尝试在OnProgress事件处理程序中获取解压缩的数据大小,则会出现EZDecompressionError异常,并显示消息“缓冲区错误”。


发生此错误是因为TStream.Size getter通过执行Seek 转发到流的末尾来检索大小,然后Seek 向后到保存的位置。由于TZDecompressionStream单向性质,请参阅class description的第3段,因此不支持后期操作。在开始实际解压缩操作之前检索大小是可能的,因为允许Seek(0, soFromBeginning)作为特殊情况,这有效地将解码器重置为初始状态。