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

Decompress Large Binary File in Blocks

See more Compression Examples

Decompresses a large binary file in blocks.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkCompression.pb"
IncludeFile "CkFileAccess.pb"

Procedure ChilkatExample()

    success.i = 0

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

    facSrc.i = CkFileAccess::ckCreate()
    If facSrc.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    facDest.i = CkFileAccess::ckCreate()
    If facDest.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

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

    success = CkFileAccess::ckOpenForRead(facSrc,"c:/temp/qa_output/compressedBmp.dat")
    If success = 0
        Debug CkFileAccess::ckLastErrorText(facSrc)
        CkFileAccess::ckDispose(facSrc)
        CkFileAccess::ckDispose(facDest)
        ProcedureReturn
    EndIf

    ;  If we compress in 32K chunks, find out how many blocks there will be.
    blockSize.i = 32768
    numBlocks.i = CkFileAccess::ckGetNumBlocks(facSrc,blockSize)

    ;  Open an output file for the decompressed data.
    success = CkFileAccess::ckOpenForWrite(facDest,"c:/temp/qa_output/decompressed.bmp")
    If success = 0
        Debug CkFileAccess::ckLastErrorText(facDest)
        CkFileAccess::ckDispose(facSrc)
        CkFileAccess::ckDispose(facDest)
        ProcedureReturn
    EndIf

    compress.i = CkCompression::ckCreate()
    If compress.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkCompression::setCkAlgorithm(compress, "deflate")

ERROR - PureBasic is an array language
ERROR - PureBasic is an array language

    ;  Assuming numBlocks > 1
    CkCompression::setCkFirstChunk(compress, 1)
    CkCompression::setCkLastChunk(compress, 0)

    i.i = 0
    While i < numBlocks
        compressedBytes = CkFileAccess::ckReadBlock(facSrc,i,blockSize)

        decompressedBytes = CkCompression::ckDecompressBytes(compress,compressedBytes)
        CkFileAccess::ckFileWrite(facDest,decompressedBytes)

        i = i + 1

        CkCompression::setCkFirstChunk(compress, 0)
        If i = (numBlocks - 1)
            CkCompression::setCkLastChunk(compress, 1)
        EndIf

    Wend

    CkFileAccess::ckFileClose(facSrc)
    CkFileAccess::ckFileClose(facDest)

    Debug "Finished decompressing file."


    CkFileAccess::ckDispose(facSrc)
    CkFileAccess::ckDispose(facDest)
    CkCompression::ckDispose(compress)


    ProcedureReturn
EndProcedure