Sample code for 30+ languages & platforms
DataFlex 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 DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoCompress
    Handle hoFac
    String sOriginalPath
Src    Handle hoFacSrc
Dest    Handle hoFacDest
    Integer iBlockSize
    Integer iNumBlocks
    String sRestoredPath
    String sDecompressedStr
    Variant hoCompressedBytes
    Integer i
    Boolean iBEqualContents
    String sTemp1
    Integer iTemp1

    Move False To iSuccess

    //  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:
    Get Create (RefClass(cComChilkatCompression)) To hoCompress
    If (Not(IsComObjectCreated(hoCompress))) Begin
        Send CreateComObject of hoCompress
    End
    Set ComAlgorithm Of hoCompress To "deflate"

    Get ComCompressFile Of hoCompress "qa_data/hamlet.xml" "qa_data/hamlet_compressed.dat" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoCompress To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get Create (RefClass(cComCkFileAccess)) To hoFac
    If (Not(IsComObjectCreated(hoFac))) Begin
        Send CreateComObject of hoFac
    End

    //  Examine the uncompressed and compressed sizes:
    Move "qa_data/hamlet.xml" To sOriginalPath
    //  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.
    Get ComFileSize Of hoFac sOriginalPath To iTemp1
    Showln "uncompressed size: " iTemp1
    Get ComFileSize Of hoFac "qa_data/hamlet_compressed.dat" To iTemp1
    Showln "compressed size: " iTemp1

    //  Decompress in blocks..
    Get Create (RefClass(cComCkFileAccess)) To hoFacSrc
    If (Not(IsComObjectCreated(hoFacSrc))) Begin
        Send CreateComObject of hoFacSrc
    End
    Get Create (RefClass(cComCkFileAccess)) To hoFacDest
    If (Not(IsComObjectCreated(hoFacDest))) Begin
        Send CreateComObject of hoFacDest
    End

    Get ComOpenForRead Of hoFacSrc "qa_data/hamlet_compressed.dat" To iSuccess

    //  If we compress in 32K chunks, find out how many blocks there will be.
    Move 32768 To iBlockSize
    Get ComGetNumBlocks Of hoFacSrc iBlockSize To iNumBlocks

    //  Open an output file for the decompressed data.
    Move "qa_output/hamlet_restored.xml" To sRestoredPath
    Get ComOpenForWrite Of hoFacDest sRestoredPath To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoFacDest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Assuming numBlocks > 1
    Set ComFirstChunk Of hoCompress To True
    Set ComLastChunk Of hoCompress To False

    Move 0 To i
    While (i < iNumBlocks)
        Get ComReadBlock Of hoFacSrc i iBlockSize To hoCompressedBytes
        Get ComDecompressString Of hoCompress vCompressedBytes To sDecompressedStr

        Get ComAppendText Of hoFacDest sDecompressedStr "utf-8" To iSuccess

        Move (i + 1) To i

        Set ComFirstChunk Of hoCompress To False
        If (i = (iNumBlocks - 1)) Begin
            Set ComLastChunk Of hoCompress To True
        End

    Loop

    Send ComFileClose To hoFacSrc
    Send ComFileClose To hoFacDest

    //  Examine the size of the restored file.
    Get ComFileSize Of hoFac sRestoredPath To iTemp1
    Showln "restored size: " iTemp1

    //  Compare the contents of the original with the restored.
    Get ComFileContentsEqual Of hoFac sRestoredPath sOriginalPath To iBEqualContents
    Showln "Contents Equal: " iBEqualContents


End_Procedure