Примеры работы с библиотекой LIBZIP

Библиотека для работы с Zip архивами. Скачать можно на этом сайте. Данную статическую библиотеку я пробовал собрать из сорцов библиотек libzip и zlib, написанных на языке С. Но как оказалось, что-то я там неправильно насобирал, в итоге многие функции не работали и так же некоторые работали не корректно. Человек, который зовет себя Coolman , помог в решении этого вопроса, скомпилировав библиотеку, в которой возможности шире, за что и спасибо ему. А я в свою очередь изменяю статью в соответствии с новыми возможностями, дополняя ее новыми примерами. Очень жаль, что я не смог получить положительный результат работы функции по установке пароля (пока не реализовано в библиотеке), в остальном вроде все работает . Платформа: Windows. Автор исходных примеров: Станислав Будинов 2011 год. А так же один пример написан автором JaDogg в 2010 году.

Обновлено: 4.08.2012 (ниже добавлены три примера с функциями zip_fopen_encrypted, zip_fopen_index_encrypted , zip_set_default_password)

 

Добавление файла:

Установка флага ZIP_CREATE нужно (как я понял) только при создании нового архива

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"


Dim As zip Ptr _zptr
Dim s As zip_source Ptr

_zptr= zip_open(@"26.zip", ZIP_CREATE,0)
If _zptr=0 Then End
s=zip_source_file(_zptr, @"file1.txt", 0, -1)
If s=0 Then End
zip_add(_zptr,@"file1.txt", s)
zip_close(_zptr)
? "OK"
Sleep

 

Добавление каталога:

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr

_zptr= zip_open(@"26.zip", ZIP_CREATE,0)
If _zptr=0 Then End
zip_add_dir(_zptr,"333")
zip_close(_zptr)
? "OK"
Sleep

 

Добавление содержимого памяти в файл и в архив:

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim s As zip_source Ptr
Dim buf As Byte Ptr=Allocate(1001)

For a As Integer = 0 To 1000
    buf[a] = Rnd*200
Next

_zptr= zip_open(@"26.zip", ZIP_CREATE,0)
If _zptr=0 Then End
s=zip_source_buffer(_zptr,buf,1000 , 0)
If s=0 Then End
zip_add(_zptr,@"file1.txt", s)
zip_close(_zptr)
Deallocate(buf)

 

Чтение файла из архива:

Чтение файла происходит по частям в зависимости от размера вашего установленного буфера. Этот пример написан автором: JaDogg для своей скомпилированной библиотеки более старой версии. Но пример оказался актуален:

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim As zip_file Ptr _zfileptr
Dim As Zstring * 1001 _zstr_1


_zptr = zip_open("a.zip",0,0)
_zfileptr = zip_fopen(_zptr, "zip.bi", 0)
zip_fread(_zfileptr, @_zstr_1, 1000)
zip_fclose(_zfileptr)
? _zstr_1
Sleep

 

Получение кол-ва файлов в архиве: 

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr

_zptr= zip_open(@"26.zip", 0,0)
If _zptr=0 Then End
? zip_get_num_files(_zptr)
zip_close(_zptr)
? "OK"
Sleep 

 

Получение данных о файле:

Данный пример показывает как можно достать информацию о файлах в архиве. На самом деле, я из структуры взял только пункты: Имя файла, его индекс, размер и CRC.  Хотя в структуре zip_stat есть и другие поля.

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim As zip_stat  file_info

_zptr= zip_open(@"26.zip", 0,0)
If _zptr=0 Then End
For a As Integer=0 To zip_get_num_files(_zptr)-1
    zip_stat_index(_zptr, a, 0, @file_info)
    ? *file_info.Name
    ? file_info.index
    ? file_info.size
    ? file_info.crc
    ?
    ?
Next
zip_close(_zptr)
? "OK"
Sleep 

 

Запись или изменение комментария в архиве:

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim As String comment="this comment"
_zptr= zip_open(@"26.zip",0,0)
If _zptr=0 Then End
zip_set_archive_comment(_zptr,comment,Len(comment))
zip_close(_zptr)
? "OK"
Sleep 

 

Чтение архивного комментария:

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim As String comment
Dim size As Integer
_zptr= zip_open(@"26.zip",0,0)
If _zptr=0 Then End
comment = *zip_get_archive_comment(_zptr,@size,0)
? Mid(comment,1,size)
zip_close(_zptr)
? "OK"
Sleep 

 

Добавление файла из другого архива:

Обратите внимание на очередность закрытия архивов. Если поменять местами, то файл не скопируется. Сначала закрывается архив, в который копировали, а потом архив-источник.

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr,_zptr1 'указатели на хендлы архива
Dim As zip_source Ptr zs  'указатель на буфер архивного файла
Dim As Integer file_idx ' индекс файла в архиве
_zptr= zip_open(@"26.zip",0,0) 'открываем 1 архив
If _zptr=0 Then End
_zptr1=zip_open("a.zip", 0, 0) 'открываем 2 архив
If _zptr1=0 Then End
file_idx=zip_name_locate(_zptr, "file2.txt", 0) ' получаем индекс файла file2.txt
zs=zip_source_zip(_zptr1, _zptr,file_idx, 0, 0, -1) 'копируем в буфер
zip_add(_zptr1, "file0.txt", zs)'добавляем во второй архив

zip_close(_zptr1)
zip_close(_zptr) 

? "OK"
Sleep 

 

Удаление файла из архива:

Файлы в архиве удаляются по индексу. Если в архиве всего один файл, то удаления не происходит. То есть для удаления файла, надо, чтобы в архиве было как минимум 2 файла. Тогда любой из них удаляется.

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr

_zptr= zip_open(@"26.zip",0,0)
If _zptr=0 Then End
zip_delete(_zptr,0) 
zip_close(_zptr)
? "OK"
Sleep

 

Изменение содержимого файла в архиве:

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim As zip_source Ptr s
_zptr= zip_open(@"26.zip",0,0)
If _zptr=0 Then End
s=zip_source_buffer(_zptr, @"ABSD", 4, 0)
zip_replace(_zptr,0,s)
zip_close(_zptr)
? "OK"
Sleep

 

Переименование файла в архиве:

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr

_zptr= zip_open(@"26.zip",0,0)
If _zptr=0 Then End
zip_rename(_zptr,0,"rename")
zip_close(_zptr)
? "OK"
Sleep

 

Установка пароля для чтения по умолчанию:

Используется только для расшифровки данных архива. На данный момент в библиотеке не реализована возможность установки пароля для шифрования файлов в архиве

/' Для примера нужен архив с именем 1.zip
и запароленным файлом внутри.
Пароль должен быть MyPass'/

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim As zip_file Ptr _zfileptr
Dim As Zstring * 1001 _zstr_1


_zptr = zip_open("1.zip",0,0)
zip_set_default_password(_zptr, "MyPass")
_zfileptr = zip_fopen(_zptr, "1.bas", 0)
If _zfileptr Then
    zip_fread(_zfileptr, @_zstr_1, 1000)
    zip_fclose(_zfileptr)
    ? _zstr_1
Else
    ? "Wrong password"
Endif
Sleep

 

Чтение запароленного архива:

Данная функция читает все зашифрованные файлы архива с общим паролем

/' Для примера нужен архив с именем 1.zip
и запароленным файлом внутри.
Пароль должен быть MyPass'/

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim As zip_file Ptr _zfileptr
Dim As Zstring * 1001 _zstr_1

_zptr = zip_open("1.zip",0,0)
_zfileptr = zip_fopen_encrypted _
( _
_zptr,"1.bas",0,"MyPass" _
)
If _zfileptr Then
    zip_fread(_zfileptr, @_zstr_1, 1000)
    zip_fclose(_zfileptr)
    ? _zstr_1
Else
    ? "Wrong password"
Endif
Sleep

 

Чтение запароленного файла:

Пароль для расшифровки ставится только для определенного файла

/' Для примера нужен архив с именем 1.zip
и запароленным файлом внутри.
Пароль должен быть MyPass'/

#INCLUDE "zlib.bi"
#INCLUDE "zip.bi"

Dim As zip Ptr _zptr
Dim As zip_file Ptr _zfileptr
Dim As Zstring * 1001 _zstr_1
Dim As Integer index = 0 ' первый файл 
_zptr = zip_open("1.zip",0,0)

/' открываем только первый
 запароленный файл '/
_zfileptr = zip_fopen_index_encrypted _
( _
_zptr,Index,0,"MyPass" _
)

If _zfileptr Then
    zip_fread(_zfileptr, @_zstr_1, 1000)
    zip_fclose(_zfileptr)
    ? _zstr_1
Else
    ? "Wrong password"
Endif
Sleep

Практически все функции при ошибке возвращают -1 , это нужно помнить при разработке. В данных примерах я старался упростить, но в реальных программах, везде нужно делать проверки работы функций. У всех функций в одном из параметров есть буфер (который я в примерах обнулял) , в него записывается содержимое ошибки.
Документацию, хоть и очень скудную, можно найти на официальном сайте. Там же можно скачать и исходник LibZip на языке С.
Это не все используемые в библиотеке функции, есть другие, но с такой документацией честно слово, методом тыка я уже замучался (хорошо хоть положили примеры некоторых функций в архиве с исходником, а то вообще труба). Если кто-то из Вас сможет показать другие возможности этой библиотеки на примерах, пишите мне и я обязательно выложу в этой статье от вашего имени.

Всего доброго!