Sample code for 30+ languages & platforms
Visual FoxPro

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 Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loZip
LOCAL loEntry
LOCAL loStreamA
LOCAL loStreamB
LOCAL loUnzipTask
LOCAL loSb
LOCAL loStreamC
LOCAL s

lnSuccess = 0

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

loZip = CreateObject('Chilkat.Zip')

* First open a .zip.
lnSuccess = loZip.OpenZip("qa_data/hamlet.zip")
IF (lnSuccess = 0) THEN
    ? loZip.LastErrorText
    RELEASE loZip
    CANCEL
ENDIF

* Find the entry to be unzipped to a stream..
loEntry = CreateObject('Chilkat.ZipEntry')
lnSuccess = loZip.EntryMatching("*hamlet.xml",loEntry)
IF (lnSuccess = 0) THEN
    ? loZip.LastErrorText
    RELEASE loZip
    RELEASE loEntry
    CANCEL
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.
loStreamA = CreateObject('Chilkat.Stream')
loStreamA.SinkFile = "qa_output/hamletA.xml"

lnSuccess = loEntry.UnzipToStream(loStreamA)
IF (lnSuccess <> 1) THEN
    ? loEntry.LastErrorText
    RELEASE loZip
    RELEASE loEntry
    RELEASE loStreamA
    CANCEL
ENDIF

* Close the stream to close the output file.
lnSuccess = loStreamA.WriteClose()

* ----------------------------------------------------------------
* Case 2a: Uzip to a stream asynchronously. 
loStreamB = CreateObject('Chilkat.Stream')

loUnzipTask = loEntry.UnzipToStreamAsync(loStreamB)
IF (loEntry.LastMethodSuccess <> 1) THEN
    ? loEntry.LastErrorText
    RELEASE loZip
    RELEASE loEntry
    RELEASE loStreamA
    RELEASE loStreamB
    CANCEL
ENDIF

* Start the background unzip thread.
loUnzipTask.Run()

* Read the stream.  (this is reading the unzipped file data)
loSb = CreateObject('Chilkat.StringBuilder')
DO WHILE loStreamB.EndOfStream <> 1
    * Each call to ReadSb appends to the contents of sb.
    loStreamB.ReadSb(loSb)
ENDDO
loSb.WriteFile("qa_output/hamletB.xml","utf-8",0)

RELEASE loUnzipTask
? "Success."

* ----------------------------------------------------------------
* Case 2b: Uzip to a stream asynchronously and emit output while reading. 
loStreamC = CreateObject('Chilkat.Stream')

loUnzipTask = loEntry.UnzipToStreamAsync(loStreamC)
IF (loEntry.LastMethodSuccess <> 1) THEN
    ? loEntry.LastErrorText
    RELEASE loZip
    RELEASE loEntry
    RELEASE loStreamA
    RELEASE loStreamB
    RELEASE loSb
    RELEASE loStreamC
    CANCEL
ENDIF

loUnzipTask.Run()

DO WHILE loStreamC.EndOfStream <> 1
    s = loStreamC.ReadString()
    ? s
ENDDO

RELEASE loUnzipTask
? "Success."

RELEASE loZip
RELEASE loEntry
RELEASE loStreamA
RELEASE loStreamB
RELEASE loSb
RELEASE loStreamC