Xbase++
Xbase++
Streaming Compression
See more Compression Examples
Compress and decompress using a stream.Chilkat Xbase++ Downloads
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()