Lianja
Lianja
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 Lianja Downloads
llSuccess = .F.
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
loZip = createobject("CkZip")
// First open a .zip.
llSuccess = loZip.OpenZip("qa_data/hamlet.zip")
if (llSuccess = .F.) then
? loZip.LastErrorText
release loZip
return
endif
// Find the entry to be unzipped to a stream..
loEntry = createobject("CkZipEntry")
llSuccess = loZip.EntryMatching("*hamlet.xml",loEntry)
if (llSuccess = .F.) then
? loZip.LastErrorText
release loZip
release loEntry
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.
loStreamA = createobject("CkStream")
loStreamA.SinkFile = "qa_output/hamletA.xml"
llSuccess = loEntry.UnzipToStream(loStreamA)
if (llSuccess <> .T.) then
? loEntry.LastErrorText
release loZip
release loEntry
release loStreamA
return
endif
// Close the stream to close the output file.
llSuccess = loStreamA.WriteClose()
// ----------------------------------------------------------------
// Case 2a: Uzip to a stream asynchronously.
loStreamB = createobject("CkStream")
loUnzipTask = loEntry.UnzipToStreamAsync(loStreamB)
if (loEntry.LastMethodSuccess <> .T.) then
? loEntry.LastErrorText
release loZip
release loEntry
release loStreamA
release loStreamB
return
endif
// Start the background unzip thread.
loUnzipTask.Run()
// Read the stream. (this is reading the unzipped file data)
loSb = createobject("CkStringBuilder")
do while loStreamB.EndOfStream <> .T.
// Each call to ReadSb appends to the contents of sb.
loStreamB.ReadSb(loSb)
enddo
loSb.WriteFile("qa_output/hamletB.xml","utf-8",.F.)
release loUnzipTask
? "Success."
// ----------------------------------------------------------------
// Case 2b: Uzip to a stream asynchronously and emit output while reading.
loStreamC = createobject("CkStream")
loUnzipTask = loEntry.UnzipToStreamAsync(loStreamC)
if (loEntry.LastMethodSuccess <> .T.) then
? loEntry.LastErrorText
release loZip
release loEntry
release loStreamA
release loStreamB
release loSb
release loStreamC
return
endif
loUnzipTask.Run()
do while loStreamC.EndOfStream <> .T.
s = loStreamC.ReadString()
? s
enddo
release loUnzipTask
? "Success."
release loZip
release loEntry
release loStreamA
release loStreamB
release loSb
release loStreamC