How can I know a decompressing progress from TZDecompressionStream if I only know packed data size

StackOverflow https://stackoverflow.com/questions/19953346

Вопрос

I'm using TZDecompressionStream to unpack compressed data. There is a property OnProgress: TNotifyEvent in TZDecompressionStream where I can check Position property of my DecompressionStream. It gives me position in unpacked data, but I don't now size of all unpacked data to estimate progress. I know only packed data size.

Is there is a way to get position in input (unpacked) data?

Это было полезно?

Решение

TZDecompressionStream.Size gives unpacked data size, but you must get this value before starting to read from stream (unpack). And if you try to get unpacked data size in OnProgress event handler you will get an EZDecompressionError exception with message 'buffer error'.


This error happens because TStream.Size getter retrieves a size by performing Seek forward to the end of stream and then Seek backward to the saved position. Latter operation is not supported due unidirectional nature of TZDecompressionStream see the 3rd paragraph of class description. Retrieval of size before starting an actual decompression operation is possible because Seek(0, soFromBeginning) is allowed as a special case, which effectively resets decoder to initial state.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top