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