Xbase++ Requires Chilkat v11.0.0+
Xbase++
Unzip One File to a Stream
See more Zip Examples
Demonstrates how to unzip a particular file contained within a .zip archive to a Chilkat stream.Chilkat Xbase++ Downloads
LOCAL nSuccess
LOCAL oZip
LOCAL oEntry
LOCAL oStreamA
LOCAL oStreamB
LOCAL oUnzipTask
LOCAL oSb
LOCAL oStreamC
LOCAL s
nSuccess := 0
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
oZip := CreateObject("Chilkat.Zip")
// First open a .zip.
nSuccess := oZip:OpenZip("qa_data/hamlet.zip")
IF (nSuccess == 0)
? oZip:LastErrorText
oZip:destroy()
RETURN
ENDIF
// Find the entry to be unzipped to a stream..
oEntry := CreateObject("Chilkat.ZipEntry")
nSuccess := oZip:EntryMatching("*hamlet.xml", oEntry)
IF (nSuccess == 0)
? oZip:LastErrorText
oZip:destroy()
oEntry:destroy()
RETURN
ENDIF
// There are three ways we can unzip (inflate) to a stream.
//
// 1) Set a sink file on the stream object and call UnzipToStream synchronously.
// This unzips to the stream's sink (which is to simply unzip to a file in the filesystem).
//
// 2) Create a stream object and call UnzipToStreamAsync. This starts the unzip in a background
// thread (after Task.Run is called). Your application can then read the unzipped (inflated) file
// directly from the stream.
//
// 3) (not shown in this example) Unzip to a stream object that is the source of something else.
//
// ----------------------------------------------------------------
// Case 1: Unzip to a file by setting the sink of streamA to a file.
oStreamA := CreateObject("Chilkat.Stream")
oStreamA:SinkFile := "qa_output/hamletA.xml"
nSuccess := oEntry:UnzipToStream(oStreamA)
IF (nSuccess != 1)
? oEntry:LastErrorText
oZip:destroy()
oEntry:destroy()
oStreamA:destroy()
RETURN
ENDIF
// Close the stream to close the output file.
nSuccess := oStreamA:WriteClose()
// ----------------------------------------------------------------
// Case 2a: Uzip to a stream asynchronously.
oStreamB := CreateObject("Chilkat.Stream")
oUnzipTask := oEntry:UnzipToStreamAsync(oStreamB)
IF (oEntry:LastMethodSuccess != 1)
? oEntry:LastErrorText
oZip:destroy()
oEntry:destroy()
oStreamA:destroy()
oStreamB:destroy()
RETURN
ENDIF
// Start the background unzip thread.
oUnzipTask:Run()
// Read the stream. (this is reading the unzipped file data)
oSb := CreateObject("Chilkat.StringBuilder")
DO WHILE oStreamB:EndOfStream != 1
// Each call to ReadSb appends to the contents of sb.
oStreamB:ReadSb(oSb)
ENDDO
oSb:WriteFile("qa_output/hamletB.xml", "utf-8", 0)
oUnzipTask:destroy()
? "Success."
// ----------------------------------------------------------------
// Case 2b: Uzip to a stream asynchronously and emit output while reading.
oStreamC := CreateObject("Chilkat.Stream")
oUnzipTask := oEntry:UnzipToStreamAsync(oStreamC)
IF (oEntry:LastMethodSuccess != 1)
? oEntry:LastErrorText
oZip:destroy()
oEntry:destroy()
oStreamA:destroy()
oStreamB:destroy()
oSb:destroy()
oStreamC:destroy()
RETURN
ENDIF
oUnzipTask:Run()
DO WHILE oStreamC:EndOfStream != 1
s := oStreamC:ReadString()
? s
ENDDO
oUnzipTask:destroy()
? "Success."
oZip:destroy()
oEntry:destroy()
oStreamA:destroy()
oStreamB:destroy()
oSb:destroy()
oStreamC:destroy()