Легкая в использовании библиотека для создания, чтения или изменения архивов
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")