Tcl Requires Chilkat v11.0.0+
Tcl
Compress Large Binary File in Blocks
See more Compression Examples
Compresses a large binary file in blocks.Chilkat Tcl Downloads
load ./chilkat.dll
set success 0
# This example assumes 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 large binary file for reading.
set success [CkFileAccess_OpenForRead $facSrc "qa_data/bmp/big.bmp"]
if {$success == 0} then {
puts [CkFileAccess_lastErrorText $facSrc]
delete_CkFileAccess $facSrc
delete_CkFileAccess $facDest
exit
}
# If we compress in 64K chunks, find out how many blocks there will be.
set blockSize 65536
set numBlocks [CkFileAccess_GetNumBlocks $facSrc $blockSize]
# Open an output file for the compressed data.
set success [CkFileAccess_OpenForWrite $facDest "c:/temp/qa_output/compressedBmp.dat"]
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 fileBytes [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 $fileBytes]
set success [CkCompression_CompressBytes $compress $fileBytes $compressedBytes]
CkFileAccess_FileWrite $facDest $compressedBytes
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 compressing file."
delete_CkFileAccess $facSrc
delete_CkFileAccess $facDest
delete_CkCompression $compress
delete_CkByteData $fileBytes
delete_CkByteData $compressedBytes