Примеры работы с библиотекой 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 на языке С.
Это не все используемые в
библиотеке функции, есть другие, но с такой документацией честно слово, методом
тыка я уже замучался (хорошо хоть положили примеры некоторых функций в архиве с
исходником, а то вообще труба). Если кто-то из Вас сможет показать другие
возможности этой библиотеки на примерах, пишите мне и я обязательно выложу в
этой статье от вашего имени.
Всего доброго!