Tcl Requires Chilkat v11.0.0+
Tcl
Decompress Large Binary File in Blocks
See more Compression Examples
Decompresses a large binary file in blocks.Chilkat Tcl Downloads
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