Sample code for 30+ languages & platforms
Xbase++

Streaming Compression

See more Compression Examples

Compress and decompress using a stream.

Chilkat Xbase++ Downloads

Xbase++
LOCAL nSuccess
LOCAL oFac
LOCAL oCompress
LOCAL oStreamC
LOCAL oStreamD
LOCAL nBFilesEqual
LOCAL oStreamA
LOCAL oTask
LOCAL cDecompressedText

nSuccess := 0

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

oFac := CreateObject("Chilkat.FileAccess")
oCompress := CreateObject("Chilkat.Compression")
oCompress:Algorithm := "deflate"

oStreamC := CreateObject("Chilkat.Stream")

//  This example sets the source and sink of the stream to files.
//  A stream can have use other streams as a source or sink,
//  or the application can itself be the source/sink by directly
//  reading or writing a stream.  (See below for an example of this..)
oStreamC:SourceFile := "qa_data/hamlet.xml"
oStreamC:SinkFile := "qa_output/hamlet_compressed.dat"

//  Compress from source to sink.
nSuccess := oCompress:CompressStream(oStreamC)
IF (nSuccess != 1)
    ? oCompress:LastErrorText
    oFac:destroy()
    oCompress:destroy()
    oStreamC:destroy()
    RETURN
ENDIF

? "File-to-file deflate compression successful."
//  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.
? "Original size = " + Str(oFac:FileSize(oStreamC:SourceFile))
? "Compressed size = " + Str(oFac:FileSize(oStreamC:SinkFile))

//  Now do file-to-file decompression
oStreamD := CreateObject("Chilkat.Stream")
oStreamD:SourceFile := "qa_output/hamlet_compressed.dat"
oStreamD:SinkFile := "qa_output/hamlet_restored.xml"

//  Decompress from source to sink.
nSuccess := oCompress:DecompressStream(oStreamD)
IF (nSuccess != 1)
    ? oCompress:LastErrorText
    oFac:destroy()
    oCompress:destroy()
    oStreamC:destroy()
    oStreamD:destroy()
    RETURN
ENDIF

? "File-to-file deflate decompression successful."

//  Let's double-check to see that the files are equal in size and content:

nBFilesEqual := oFac:FileContentsEqual(oStreamC:SourceFile, oStreamD:SinkFile)
IF (nBFilesEqual != 1)
    ? "The output file is not equal to the input file!"
ELSE
    ? "The file was successfully compressed and decompressed."
ENDIF

//  ---------------------------------------------------------------------
//  Now let's decompress again, but this time w/ the application reading
//  the decompressed data directly from a stream.
oStreamA := CreateObject("Chilkat.Stream")

oStreamA:SourceFile := "qa_output/hamlet_compressed.dat"

//  Start decompressing in a background thread.
oTask := oCompress:DecompressStreamAsync(oStreamA)
nSuccess := oTask:Run()

//  Read decompressed data from streamA:

DO WHILE (oStreamA:EndOfStream != 1)
    IF (oStreamA:DataAvailable == 1)
        cDecompressedText := oStreamA:ReadString()
        ? cDecompressedText
    ENDIF

ENDDO

//  Let's make sure the background task finished and that the decompress was successful.
//  It should already be the case that the task is finished.
DO WHILE (oTask:Finished != 1)
    oTask:SleepMs(20)
ENDDO

//  The decompressor may have finished, but it is possible that data
//  remains to be flushed.  
IF (oStreamA:DataAvailable == 1)
    cDecompressedText := oStreamA:ReadString()
    ? cDecompressedText
ENDIF

//  Did streamA succeed in reading the entire file?
IF (oTask:TaskSuccess != 1)
    ? "async decompress failed:"
    ? oTask:ResultErrorText
    nSuccess := 0
ENDIF

? "The async decompress was successful."

oFac:destroy()
oCompress:destroy()
oStreamC:destroy()
oStreamD:destroy()
oStreamA:destroy()