Lianja
Lianja
Streaming Compression
See more Compression Examples
Compress and decompress using a stream.Chilkat Lianja Downloads
llSuccess = .F.
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
loFac = createobject("CkFileAccess")
loCompress = createobject("CkCompression")
loCompress.Algorithm = "deflate"
loStreamC = createobject("CkStream")
// 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..)
loStreamC.SourceFile = "qa_data/hamlet.xml"
loStreamC.SinkFile = "qa_output/hamlet_compressed.dat"
// Compress from source to sink.
llSuccess = loCompress.CompressStream(loStreamC)
if (llSuccess <> .T.) then
? loCompress.LastErrorText
release loFac
release loCompress
release loStreamC
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(loFac.FileSize(loStreamC.SourceFile))
? "Compressed size = " + str(loFac.FileSize(loStreamC.SinkFile))
// Now do file-to-file decompression
loStreamD = createobject("CkStream")
loStreamD.SourceFile = "qa_output/hamlet_compressed.dat"
loStreamD.SinkFile = "qa_output/hamlet_restored.xml"
// Decompress from source to sink.
llSuccess = loCompress.DecompressStream(loStreamD)
if (llSuccess <> .T.) then
? loCompress.LastErrorText
release loFac
release loCompress
release loStreamC
release loStreamD
return
endif
? "File-to-file deflate decompression successful."
// Let's double-check to see that the files are equal in size and content:
llBFilesEqual = loFac.FileContentsEqual(loStreamC.SourceFile,loStreamD.SinkFile)
if (llBFilesEqual <> .T.) then
? "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.
loStreamA = createobject("CkStream")
loStreamA.SourceFile = "qa_output/hamlet_compressed.dat"
// Start decompressing in a background thread.
loTask = loCompress.DecompressStreamAsync(loStreamA)
llSuccess = loTask.Run()
// Read decompressed data from streamA:
do while (loStreamA.EndOfStream <> .T.)
if (loStreamA.DataAvailable = .T.) then
lcDecompressedText = loStreamA.ReadString()
? lcDecompressedText
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 (loTask.Finished <> .T.)
loTask.SleepMs(20)
enddo
// The decompressor may have finished, but it is possible that data
// remains to be flushed.
if (loStreamA.DataAvailable = .T.) then
lcDecompressedText = loStreamA.ReadString()
? lcDecompressedText
endif
// Did streamA succeed in reading the entire file?
if (loTask.TaskSuccess <> .T.) then
? "async decompress failed:"
? loTask.ResultErrorText
llSuccess = .F.
endif
? "The async decompress was successful."
release loFac
release loCompress
release loStreamC
release loStreamD
release loStreamA