Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Go) Streaming CompressionCompress and decompress using a stream.
// This example assumes the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. fac := chilkat.NewFileAccess() compress := chilkat.NewCompression() compress.SetAlgorithm("deflate") streamC := chilkat.NewStream() // 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.SetSourceFile("qa_data/hamlet.xml") streamC.SetSinkFile("qa_output/hamlet_compressed.dat") // Compress from source to sink. success := compress.CompressStream(streamC) if success != true { fmt.Println(compress.LastErrorText()) fac.DisposeFileAccess() compress.DisposeCompression() streamC.DisposeStream() return } fmt.Println("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. fmt.Println("Original size = ", fac.FileSize(streamC.SourceFile())) fmt.Println("Compressed size = ", fac.FileSize(streamC.SinkFile())) // Now do file-to-file decompression streamD := chilkat.NewStream() streamD.SetSourceFile("qa_output/hamlet_compressed.dat") streamD.SetSinkFile("qa_output/hamlet_restored.xml") // Decompress from source to sink. success = compress.DecompressStream(streamD) if success != true { fmt.Println(compress.LastErrorText()) fac.DisposeFileAccess() compress.DisposeCompression() streamC.DisposeStream() streamD.DisposeStream() return } fmt.Println("File-to-file deflate decompression successful.") // Let's double-check to see that the files are equal in size and content: bFilesEqual := fac.FileContentsEqual(streamC.SourceFile(),streamD.SinkFile()) if bFilesEqual != true { fmt.Println("The output file is not equal to the input file!") } else { fmt.Println("The file was successfully compressed and decompressed.") } // --------------------------------------------------------------------- // Now let's decompress again, but this time w/ the application reading // the decompressed data directly from a stream. streamA := chilkat.NewStream() streamA.SetSourceFile("qa_output/hamlet_compressed.dat") // Start decompressing in a background thread. c := make(chan *chilkat.Task) go compress.DecompressStreamAsync(streamA,c) task := <-c // Read decompressed data from streamA: var decompressedText *string = new(string) for (streamA.EndOfStream() != true) { if streamA.DataAvailable() == true { decompressedText = streamA.ReadString() fmt.Println(*decompressedText) } } // 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. for (task.Finished() != true) { task.SleepMs(20) } // The decompressor may have finished, but it is possible that data // remains to be flushed. if streamA.DataAvailable() == true { decompressedText = streamA.ReadString() fmt.Println(*decompressedText) } // Did streamA succeed in reading the entire file? if task.TaskSuccess() != true { fmt.Println("async decompress failed:") fmt.Println(task.ResultErrorText()) success = false } fmt.Println("The async decompress was successful.") fac.DisposeFileAccess() compress.DisposeCompression() streamC.DisposeStream() streamD.DisposeStream() streamA.DisposeStream() task.DisposeTask() |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.