【问题标题】:How can I know a decompressing progress from TZDecompressionStream if I only know packed data size如果我只知道打包数据的大小,我如何知道 TZDecompressionStream 的解压进度
【发布时间】:2013-11-13 12:05:12
【问题描述】:
我正在使用TZDecompressionStream 解压缩压缩数据。在TZDecompressionStream 中有一个属性OnProgress: TNotifyEvent,我可以在其中检查我的DecompressionStream 的Position 属性。它为我提供了未打包数据中的位置,但我现在不使用所有未打包数据的大小来估计进度。我只知道打包数据的大小。
有没有办法在输入(解包)数据中获取位置?
【问题讨论】:
标签:
delphi
stream
delphi-2010
zlib
compression
【解决方案1】:
TZDecompressionStream.Size 给出解压后的数据大小,但您必须在开始从流中读取(解压)之前获取此值。如果您尝试在 OnProgress 事件处理程序中获取解包数据大小,您将收到带有消息“缓冲区错误”的 EZDecompressionError 异常。
发生此错误是因为TStream.Size getter 通过执行Seek forward 到流的末尾然后Seek backward 到保存的位置来检索大小。由于TZDecompressionStream 的单向性质,不支持后一种操作,请参阅class description 的第三段。 在开始实际解压缩操作之前检索大小是可能的,因为Seek(0, soFromBeginning) 被允许作为一种特殊情况,它有效地将解码器重置为初始状态。