Sample code for 30+ languages & platforms
Xbase++ Requires Chilkat v11.0.0+

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

Xbase++
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()