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

Decompress Large Text File in Blocks

See more Compression Examples

Decompresses a large text file in blocks, and compares the restored (decompressed) file with the original to make sure it's correct.

Chilkat Lianja Downloads

Lianja
llSuccess = .F.

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

//  First, let's compress a text file.
//  We'll then decompress in blocks, and compare the decompressed with the original file.

//  Compress a text file:
loCompress = createobject("CkCompression")
loCompress.Algorithm = "deflate"

llSuccess = loCompress.CompressFile("qa_data/hamlet.xml","qa_data/hamlet_compressed.dat")
if (llSuccess = .F.) then
    ? loCompress.LastErrorText
    release loCompress
    return
endif

loFac = createobject("CkFileAccess")

//  Examine the uncompressed and compressed sizes:
lcOriginalPath = "qa_data/hamlet.xml"
//  Note: The FileSize method returns a signed 32-bit integer.  If the file is potentially larger than 2GB, call FileSizeStr instead to return
//  the size of the file as a string, then convert to an integer value.
? "uncompressed size: " + str(loFac.FileSize(lcOriginalPath))
? "compressed size: " + str(loFac.FileSize("qa_data/hamlet_compressed.dat"))

//  Decompress in blocks..
loFacSrc = createobject("CkFileAccess")
loFacDest = createobject("CkFileAccess")

loFacSrc.OpenForRead("qa_data/hamlet_compressed.dat")

//  If we compress in 32K chunks, find out how many blocks there will be.
lnBlockSize = 32768
lnNumBlocks = loFacSrc.GetNumBlocks(lnBlockSize)

//  Open an output file for the decompressed data.
lcRestoredPath = "qa_output/hamlet_restored.xml"
llSuccess = loFacDest.OpenForWrite(lcRestoredPath)
if (llSuccess = .F.) then
    ? loFacDest.LastErrorText
    release loCompress
    release loFac
    release loFacSrc
    release loFacDest
    return
endif

//  Assuming numBlocks > 1
loCompress.FirstChunk = .T.
loCompress.LastChunk = .F.

i = 0
do while i < lnNumBlocks
    loCompressedBytes = loFacSrc.ReadBlock(i,lnBlockSize)
    lcDecompressedStr = loCompress.DecompressString(loCompressedBytes)

    loFacDest.AppendText(lcDecompressedStr,"utf-8")

    i = i + 1

    loCompress.FirstChunk = .F.
    if (i = (lnNumBlocks - 1)) then
        loCompress.LastChunk = .T.
    endif

enddo

loFacSrc.FileClose()
loFacDest.FileClose()

//  Examine the size of the restored file.
? "restored size: " + str(loFac.FileSize(lcRestoredPath))

//  Compare the contents of the original with the restored.
llBEqualContents = loFac.FileContentsEqual(lcRestoredPath,lcOriginalPath)
? "Contents Equal: " + str(llBEqualContents)


release loCompress
release loFac
release loFacSrc
release loFacDest