Help Center
Help CenterFreeBASICTutorials

libzip

Documentation

Easy-to-use library for creating, reading out or modifying .zip archives.

Website: https://libzip.org
Github: https://github.com/nih-at/libzip
Platforms supported: Win32, Linux, DOS
Headers to include: zip.bi
Header version: 0.11.2
Examples: in examples/compression/

Example

'' .zip unpacking using libzip

#include Once "zip.bi"



Sub create_parent_dirs(ByVal file As ZString Ptr)

    '' Given a path like this:

    '' foo/bar/baz/file.ext

    '' Do these mkdir()'s:

    '' foo

    '' foo/bar

    '' foo/bar/baz

    Dim As UByte Ptr p = file

    Do

        Select Case (*p)

        Case Asc("/")

            *p = 0

            MkDir(*file)

            *p = Asc("/")

        Case 0

            Exit Do

        End Select

        p += 1

    Loop

End Sub



'' Asks libzip for information on file number 'i' in the .zip file,

'' and then extracts it, while creating directories as needed.

Private Sub unpack_zip_file(ByVal zip As Any Ptr, ByVal i As Integer)

    #define BUFFER_SIZE (1024 * 512)

    Static As UByte chunk(0 To (BUFFER_SIZE - 1))

    #define buffer (@chunk(0))



    '' Retrieve the filename.

    Dim As String filename = *zip_get_name(zip, i, 0)

    Print "file: " & filename & ", ";



    '' Retrieve the file size via a zip_stat().

    Dim As zip_stat stat

    If (zip_stat_index(zip, i, 0, @stat)) Then

        Print "zip_stat() failed"

        Return

    End If



    If ((stat.valid And ZIP_STAT_SIZE) = 0) Then

        Print "could not retrieve file size from zip_stat()"

        Return

    End If



    Print stat.size & " bytes"



    '' Create directories if needed

    create_parent_dirs(filename)



    '' Write out the file

    Dim As Integer fo = FreeFile()

    If (Open(filename, For Binary, Access Write, As #fo)) Then

        Print "could not open output file"

        Return

    End If



    '' Input for the file comes from libzip

    Dim As Any Ptr fi = zip_fopen_index(zip, i, 0)

    Do

        '' Write out the file content as returned by zip_fread(), which

        '' also does the decoding and everything.

        '' zip_fread() fills our buffer

        Dim As Integer bytes = _

            zip_fread(fi, buffer, BUFFER_SIZE)

        If (bytes < 0) Then

            Print "zip_fread() failed"

            Exit Do

        End If



        '' EOF?

        If (bytes = 0) Then

            Exit Do

        End If



        '' Write <bytes> amount of bytes of the file

        If (Put(#fo, , *buffer, bytes)) Then

            Print "file output failed"

            Exit Do

        End If

    Loop



    '' Done

    zip_fclose(fi)

    Close #fo

End Sub



Sub unpack_zip(ByRef archive As String)

    Dim As Any Ptr zip = zip_open(archive, ZIP_CHECKCONS, NULL)

    If (zip = NULL) Then

        Print "could not open input file " & archive

        Return

    End If



    '' For each file in the .zip... (really nice API, thanks libzip)

    For i As Integer = 0 To (zip_get_num_entries(zip, 0) - 1)

        unpack_zip_file(zip, i)

    Next



    zip_close(zip)

End Sub





    unpack_zip("test.zip")

'' .zip packing using libzip

#include "zip.bi"



Sub zipAddFileFromString(ByVal fname As ZString Ptr, ByVal id_d As ZString Ptr, ByVal myData As ZString Ptr)

    Dim As Any Ptr pzo

    Dim As Any Ptr pzsb

   

    pzo = zip_open(fname, ZIP_CREATE, 0)

    If pzo = 0 Then End

   

    pzsb = zip_source_buffer(pzo, myData, Len(*myData), 0)

    If pzsb = 0 Then End

   

    zip_file_add(pzo, id_d, pzsb, ZIP_FL_OVERWRITE)

    zip_close(pzo)

   

    Print "OK"

End Sub



Dim As String mytext, myzipfile, myfile



myText    = "<My text           >......6...3..2"

myZipFile = "26.zip"

myFile    = "file3.txt"



zipAddFileFromString(myZipFile, myFile, myText)



myFile    = "BIMBO/file3.txt"

zipAddFileFromString(myZipFile, myFile, myText)



Sleep