Sample code for 30+ languages & platforms
Tcl Requires Chilkat v11.0.0+

Decompress Large Binary File in Blocks

See more Compression Examples

Decompresses a large binary file in blocks.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

#  This example requires the Chilkat API to have been previously unlocked.
#  See Global Unlock Sample for sample code.

set facSrc [new_CkFileAccess]

set facDest [new_CkFileAccess]

#  Open a previously compressed file for decompressing.
#  See Compress Large File in Blocks

set success [CkFileAccess_OpenForRead $facSrc "c:/temp/qa_output/compressedBmp.dat"]
if {$success == 0} then {
    puts [CkFileAccess_lastErrorText $facSrc]
    delete_CkFileAccess $facSrc
    delete_CkFileAccess $facDest
    exit
}

#  If we compress in 32K chunks, find out how many blocks there will be.
set blockSize 32768
set numBlocks [CkFileAccess_GetNumBlocks $facSrc $blockSize]

#  Open an output file for the decompressed data.
set success [CkFileAccess_OpenForWrite $facDest "c:/temp/qa_output/decompressed.bmp"]
if {$success == 0} then {
    puts [CkFileAccess_lastErrorText $facDest]
    delete_CkFileAccess $facSrc
    delete_CkFileAccess $facDest
    exit
}

set compress [new_CkCompression]

CkCompression_put_Algorithm $compress "deflate"

set decompressedBytes [new_CkByteData]

set compressedBytes [new_CkByteData]

#  Assuming numBlocks > 1
CkCompression_put_FirstChunk $compress 1
CkCompression_put_LastChunk $compress 0

set i 0
while {$i < $numBlocks} {
    set success [CkFileAccess_ReadBlock $facSrc $i $blockSize $compressedBytes]

    set success [CkCompression_DecompressBytes $compress $compressedBytes $decompressedBytes]
    CkFileAccess_FileWrite $facDest $decompressedBytes

    set i [expr $i + 1]

    CkCompression_put_FirstChunk $compress 0
    if {$i == [expr $numBlocks - 1]} then {
        CkCompression_put_LastChunk $compress 1
    }

}

CkFileAccess_FileClose $facSrc
CkFileAccess_FileClose $facDest

puts "Finished decompressing file."

delete_CkFileAccess $facSrc
delete_CkFileAccess $facDest
delete_CkCompression $compress
delete_CkByteData $decompressedBytes
delete_CkByteData $compressedBytes