Sample code for 30+ languages & platforms
PureBasic

Controlling paths within a Zip

See more Zip Examples

How to control the paths stored within a .zip.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkZip.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

    ; This is the directory structure on the local filesystem
    ; from which we'll create .zip archives:
    ; The root directory is /temp/filesToZip
    ; 
    ; We have these files:
    ; /temp/filesToZip/faxCover.doc
    ; /temp/filesToZip/exe/Setup.exe
    ; /temp/filesToZip/images/cheese.jpg
    ; /temp/filesToZip/images/dude.gif
    ; /temp/filesToZip/images/img3.gif
    ; /temp/filesToZip/images/img4.gif
    ; /temp/filesToZip/images/img5.gif
    ; /temp/filesToZip/images/scream.jpg
    ; /temp/filesToZip/images/imageInfo/scream.xml
    ; /temp/filesToZip/images/imageInfo/cheese.xml
    ; /temp/filesToZip/text/html/bonaireFishing.html
    ; /temp/filesToZip/text/html/upload.html
    ; /temp/filesToZip/text/txt/hello.txt
    ; /temp/filesToZip/text/txt/HelloWorld123.txt
    ; /temp/filesToZip/text/xml/hamlet.xml
    ; /temp/filesToZip/text/xml/pigs.xml

    ; There are three properties to help control the paths stored
    ; within a .zip:
    ; AppendFromDir
    ; PathPrefix
    ; DiscardPaths
    ; 

    ; First we'll demonstrate AppendFromDir
    ; When a directory tree is appended via AppendFiles or
    ; AppendFilesEx, the AppendFromDir sets the base of the 
    ; directory tree appended (if the file pattern contains a 
    ; relative path, or no path at all).

    ; Clear the zip object.
    CkZip::ckNewZip(zip,"test1.zip")

    recurse.i = 1

    CkZip::setCkAppendFromDir(zip, "/temp/filesToZip")
    success = CkZip::ckAppendFiles(zip,"*.xml",recurse)

    ; The zip will contain:
    ; images/imageInfo/scream.xml
    ; images/imageInfo/cheese.xml
    ; text/xml/hamlet.xml
    ; text/xml/pigs.xml

    success = CkZip::ckWriteZipAndClose(zip)
    If success <> 1
        Debug CkZip::ckLastErrorText(zip)
        CkZip::ckDispose(zip)
        ProcedureReturn
    EndIf

    ; Clear the zip object.
    success = CkZip::ckNewZip(zip,"test2.zip")

    CkZip::setCkAppendFromDir(zip, "/temp/filesToZip/images")
    success = CkZip::ckAppendFiles(zip,"*.xml",recurse)
    CkZip::setCkAppendFromDir(zip, "/temp/filesToZip/text")
    success = CkZip::ckAppendFiles(zip,"*.xml",recurse)

    ; The zip will contain:
    ; imageInfo/scream.xml
    ; imageInfo/cheese.xml
    ; xml/hamlet.xml
    ; xml/pigs.xml

    success = CkZip::ckWriteZipAndClose(zip)
    If success <> 1
        Debug CkZip::ckLastErrorText(zip)
        CkZip::ckDispose(zip)
        ProcedureReturn
    EndIf

    ; The PathPrefix property adds an arbitrary path prefix to each
    ; file in the .zip.
    ; For example:

    ; Clear the zip object.
    success = CkZip::ckNewZip(zip,"test3.zip")

    CkZip::setCkPathPrefix(zip, "chilkat/")

    CkZip::setCkAppendFromDir(zip, "/temp/filesToZip/images")
    success = CkZip::ckAppendFiles(zip,"*.xml",recurse)
    CkZip::setCkAppendFromDir(zip, "/temp/filesToZip/text")
    success = CkZip::ckAppendFiles(zip,"*.xml",recurse)

    ; The zip will contain:
    ; chilkat/imageInfo/scream.xml
    ; chilkat/imageInfo/cheese.xml
    ; chilkat/xml/hamlet.xml
    ; chilkat/xml/pigs.xml

    success = CkZip::ckWriteZipAndClose(zip)
    If success <> 1
        Debug CkZip::ckLastErrorText(zip)
        CkZip::ckDispose(zip)
        ProcedureReturn
    EndIf

    ; The DiscardPaths property removes the path from each file
    ; in the zip:
    ; For example:

    ; Clear the zip object.
    success = CkZip::ckNewZip(zip,"test4.zip")

    CkZip::setCkPathPrefix(zip, "")
    CkZip::setCkDiscardPaths(zip, 1)

    CkZip::setCkAppendFromDir(zip, "/temp/filesToZip/")
    success = CkZip::ckAppendFiles(zip,"*",recurse)

    ; The zip will contain:
    ; faxCover.doc
    ; Setup.exe
    ; cheese.jpg
    ; dude.gif
    ; img3.gif
    ; img4.gif
    ; img5.gif
    ; scream.jpg
    ; scream.xml
    ; cheese.xml
    ; bonaireFishing.html
    ; upload.html
    ; hello.txt
    ; HelloWorld123.txt
    ; hamlet.xml
    ; pigs.xml

    success = CkZip::ckWriteZipAndClose(zip)
    If success <> 1
        Debug CkZip::ckLastErrorText(zip)
        CkZip::ckDispose(zip)
        ProcedureReturn
    EndIf

    ; You can combine PathPrefix with DiscardPaths:

    ; Clear the zip object.
    success = CkZip::ckNewZip(zip,"test5.zip")

    CkZip::setCkPathPrefix(zip, "chilkat/")
    CkZip::setCkDiscardPaths(zip, 1)

    CkZip::setCkAppendFromDir(zip, "/temp/filesToZip/")
    success = CkZip::ckAppendFiles(zip,"*",recurse)

    ; The zip will contain:
    ; chilkat/faxCover.doc
    ; chilkat/Setup.exe
    ; chilkat/cheese.jpg
    ; chilkat/dude.gif
    ; chilkat/img3.gif
    ; chilkat/img4.gif
    ; chilkat/img5.gif
    ; chilkat/scream.jpg
    ; chilkat/scream.xml
    ; chilkat/cheese.xml
    ; chilkat/bonaireFishing.html
    ; chilkat/upload.html
    ; chilkat/hello.txt
    ; chilkat/HelloWorld123.txt
    ; chilkat/hamlet.xml
    ; chilkat/pigs.xml

    success = CkZip::ckWriteZipAndClose(zip)
    If success <> 1
        Debug CkZip::ckLastErrorText(zip)
        CkZip::ckDispose(zip)
        ProcedureReturn
    EndIf

    ; One last example -- combine DiscardPaths with PathPrefix
    ; with multiple calls to AppendFiles:

    ; Clear the zip object.
    success = CkZip::ckNewZip(zip,"test6.zip")

    CkZip::setCkDiscardPaths(zip, 1)
    CkZip::setCkAppendFromDir(zip, "/temp/filesToZip/")

    ; Get all .gif files:
    CkZip::setCkPathPrefix(zip, "gif/")
    success = CkZip::ckAppendFiles(zip,"*.gif",recurse)

    ; Get all .jpg files:
    CkZip::setCkPathPrefix(zip, "jpg/")
    success = CkZip::ckAppendFiles(zip,"*.jpg",recurse)

    ; Get all .xml files:
    CkZip::setCkPathPrefix(zip, "xml/")
    success = CkZip::ckAppendFiles(zip,"*.xml",recurse)

    ; The zip will contain:
    ; jpg/cheese.jpg
    ; gif/dude.gif
    ; gif/img3.gif
    ; gif/img4.gif
    ; gif/img5.gif
    ; jpg/scream.jpg
    ; xml/scream.xml
    ; xml/cheese.xml
    ; xml/hamlet.xml
    ; xml/pigs.xml

    success = CkZip::ckWriteZipAndClose(zip)
    If success <> 1
        Debug CkZip::ckLastErrorText(zip)
        CkZip::ckDispose(zip)
        ProcedureReturn
    EndIf



    CkZip::ckDispose(zip)


    ProcedureReturn
EndProcedure