Sample code for 30+ languages & platforms
PureBasic

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 PureBasic Downloads

PureBasic
IncludeFile "CkZipEntry.pb"
IncludeFile "CkZip.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkTask.pb"
IncludeFile "CkStream.pb"

Procedure ChilkatExample()

    success.i = 0

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

    zip.i = CkZip::ckCreate()
    If zip.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; First open a .zip.
    success = CkZip::ckOpenZip(zip,"qa_data/hamlet.zip")
    If success = 0
        Debug CkZip::ckLastErrorText(zip)
        CkZip::ckDispose(zip)
        ProcedureReturn
    EndIf

    ; Find the entry to be unzipped to a stream..
    entry.i = CkZipEntry::ckCreate()
    If entry.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkZip::ckEntryMatching(zip,"*hamlet.xml",entry)
    If success = 0
        Debug CkZip::ckLastErrorText(zip)
        CkZip::ckDispose(zip)
        CkZipEntry::ckDispose(entry)
        ProcedureReturn
    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.
    streamA.i = CkStream::ckCreate()
    If streamA.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkStream::setCkSinkFile(streamA, "qa_output/hamletA.xml")

    success = CkZipEntry::ckUnzipToStream(entry,streamA)
    If success <> 1
        Debug CkZipEntry::ckLastErrorText(entry)
        CkZip::ckDispose(zip)
        CkZipEntry::ckDispose(entry)
        CkStream::ckDispose(streamA)
        ProcedureReturn
    EndIf

    ; Close the stream to close the output file.
    success = CkStream::ckWriteClose(streamA)

    ; ----------------------------------------------------------------
    ; Case 2a: Uzip to a stream asynchronously. 
    streamB.i = CkStream::ckCreate()
    If streamB.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    unzipTask.i = CkZipEntry::ckUnzipToStreamAsync(entry,streamB)
    If CkZipEntry::ckLastMethodSuccess(entry) <> 1
        Debug CkZipEntry::ckLastErrorText(entry)
        CkZip::ckDispose(zip)
        CkZipEntry::ckDispose(entry)
        CkStream::ckDispose(streamA)
        CkStream::ckDispose(streamB)
        ProcedureReturn
    EndIf

    ; Start the background unzip thread.
    CkTask::ckRun(unzipTask)

    ; Read the stream.  (this is reading the unzipped file data)
    sb.i = CkStringBuilder::ckCreate()
    If sb.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    While CkStream::ckEndOfStream(streamB) <> 1
        ; Each call to ReadSb appends to the contents of sb.
        CkStream::ckReadSb(streamB,sb)
    Wend
    CkStringBuilder::ckWriteFile(sb,"qa_output/hamletB.xml","utf-8",0)

    CkTask::ckDispose(unzipTask)

    Debug "Success."

    ; ----------------------------------------------------------------
    ; Case 2b: Uzip to a stream asynchronously and emit output while reading. 
    streamC.i = CkStream::ckCreate()
    If streamC.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    unzipTask = CkZipEntry::ckUnzipToStreamAsync(entry,streamC)
    If CkZipEntry::ckLastMethodSuccess(entry) <> 1
        Debug CkZipEntry::ckLastErrorText(entry)
        CkZip::ckDispose(zip)
        CkZipEntry::ckDispose(entry)
        CkStream::ckDispose(streamA)
        CkStream::ckDispose(streamB)
        CkStringBuilder::ckDispose(sb)
        CkStream::ckDispose(streamC)
        ProcedureReturn
    EndIf

    CkTask::ckRun(unzipTask)

    While CkStream::ckEndOfStream(streamC) <> 1
        s.s = CkStream::ckReadString(streamC)
        Debug s
    Wend

    CkTask::ckDispose(unzipTask)

    Debug "Success."


    CkZip::ckDispose(zip)
    CkZipEntry::ckDispose(entry)
    CkStream::ckDispose(streamA)
    CkStream::ckDispose(streamB)
    CkStringBuilder::ckDispose(sb)
    CkStream::ckDispose(streamC)


    ProcedureReturn
EndProcedure