Sample code for 30+ languages & platforms
Visual FoxPro 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 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