libzip
 
Легкая в использовании библиотека для создания, чтения или изменения архивов ZIP.

Вебсайт: http://www.nih.at/libzip/
Поддерживаемые платформы: Win32, Linux, DOS
Заголовки: zip.bi
Версия заголовков: 0.11
Примеры: в examples/compression/

Пример

'' .zip распаковка, используя libzip
#include once "zip.bi"

Sub create_parent_dirs(ByVal file As ZString Ptr)
    '' Учитывая путь, как:
    '' foo/bar/baz/file.ext
    '' Делаем их с помощью mkdir():
    '' 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

'' Спрашиваем libzip для получения информации о номере файла "i" в .zip файле,
'' а затем извлекаем его, создавая каталоги по мере необходимости.
Private Sub unpack_zip_file(ByVal zip As zip Ptr, ByVal i As Integer)
    #define BUFFER_SIZE (1024 * 512)
    Static As UByte chunk(0 To (BUFFER_SIZE - 1))
    #define buffer (@chunk(0))

    '' Получить имя файла.
    Dim As String filename = *zip_get_name(zip, i, 0)
    Print "file: " & filename & ", ";

    '' Получить размер файла через 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_parent_dirs(filename)

    '' Записать файл
    Dim As Integer fo = FreeFile()
    If (Open(filename, For Binary, Access Write, As #fo)) Then
        Print "could not open output file"
        Return
    End If

    '' Входные данные для файла берутся из libzip
    Dim As zip_file Ptr fi = zip_fopen_index(zip, i, 0)
    Do
        '' Запись содержимого файла, возвращенное методом zip_fread(), который
        '' также выполняет декодирование и все остальное.
        '' zip_fread() заполняет наш буфер
        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

        '' Записать <bytes> количество байтов файла
        If (Put(#fo, , *buffer, bytes)) Then
            Print "file output failed"
            Exit Do
        End If
    Loop

    '' готово
    zip_fclose(fi)
    Close #fo
End Sub

Sub unpack_zip(ByRef archive As String)
    Dim As zip Ptr zip = zip_open(archive, ZIP_CHECKCONS, NULL)
    If (zip = NULL) Then
        Print "could not open input file " & archive
        Return
    End If

    '' Для каждого файла в ZIP... (действительно приятные API, спасибо 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")