Sample code for 30+ languages & platforms
Xojo Plugin

Streaming Compression

See more Compression Examples

Compress and decompress using a stream.

Chilkat Xojo Plugin Downloads

Xojo Plugin
Dim success As Boolean
success = False

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

Dim fac As New Chilkat.FileAccess
Dim compress As New Chilkat.Compression
compress.Algorithm = "deflate"

Dim streamC As New 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..)
streamC.SourceFile = "qa_data/hamlet.xml"
streamC.SinkFile = "qa_output/hamlet_compressed.dat"

// Compress from source to sink.
success = compress.CompressStream(streamC)
If (success <> True) Then
    System.DebugLog(compress.LastErrorText)
    Return
End If

System.DebugLog("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.
System.DebugLog("Original size = " + Str(fac.FileSize(streamC.SourceFile)))
System.DebugLog("Compressed size = " + Str(fac.FileSize(streamC.SinkFile)))

// Now do file-to-file decompression
Dim streamD As New Chilkat.Stream
streamD.SourceFile = "qa_output/hamlet_compressed.dat"
streamD.SinkFile = "qa_output/hamlet_restored.xml"

// Decompress from source to sink.
success = compress.DecompressStream(streamD)
If (success <> True) Then
    System.DebugLog(compress.LastErrorText)
    Return
End If

System.DebugLog("File-to-file deflate decompression successful.")

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

Dim bFilesEqual As Boolean
bFilesEqual = fac.FileContentsEqual(streamC.SourceFile,streamD.SinkFile)
If (bFilesEqual <> True) Then
    System.DebugLog("The output file is not equal to the input file!")
Else
    System.DebugLog("The file was successfully compressed and decompressed.")
End If

// ---------------------------------------------------------------------
// Now let's decompress again, but this time w/ the application reading
// the decompressed data directly from a stream.
Dim streamA As New Chilkat.Stream

streamA.SourceFile = "qa_output/hamlet_compressed.dat"

// Start decompressing in a background thread.
Dim task As Chilkat.Task
task = compress.DecompressStreamAsync(streamA)
success = task.Run()

// Read decompressed data from streamA:
Dim decompressedText As String
While (streamA.EndOfStream <> True)
    If (streamA.DataAvailable = True) Then
        decompressedText = streamA.ReadString()
        System.DebugLog(decompressedText)
    End If

Wend

// 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.
While (task.Finished <> True)
    task.SleepMs 20
Wend

// The decompressor may have finished, but it is possible that data
// remains to be flushed.  
If (streamA.DataAvailable = True) Then
    decompressedText = streamA.ReadString()
    System.DebugLog(decompressedText)
End If

// Did streamA succeed in reading the entire file?
If (task.TaskSuccess <> True) Then
    System.DebugLog("async decompress failed:")
    System.DebugLog(task.ResultErrorText)
    success = False
End If

System.DebugLog("The async decompress was successful.")