Estrarre con le funzioni del API di libzip i file contenuti da un file compresso .zip

Da Gambas-it.org - Wikipedia.

La libreria libzip consente di gestire file compressi .zip.

Per poter fruire in gambas delle risorse della libreria libzip, è necessario installare e richiamare la libreria condivisa: "libzip.so.5.0 "

Mostriamo un esempio pratico per estrarre uno o più file contenuti in un file compresso .zip:

Library "libzip:5.0"

Public Struct zip_stat
  valid As Long
  name As Pointer
  index As Long
  size As Long
  comp_size As Long
  mtime As Long
  crc As Integer
  comp_method As Short
  encryption_method As Short
  flags As Integer
End Struct

' struct zip *zip_open(const char *, int, int *)
' Open zip archive.
Private Extern zip_open(path As String, flags As Integer, errorp As Pointer) As Pointer

' zip_int64_t zip_get_num_entries(zip_t *, zip_flags_t)
' Get number of files in archive.
Private Extern zip_get_num_entries(archive As Pointer, flags As Integer) As Long

' int zip_stat_index(struct zip *, int, int, struct zip_stat *)
' Get information about file by index.
Private Extern zip_stat_index(archive As Pointer, index As Integer, flags As Integer, sb As Zip_stat) As Integer

' struct zip_file * zip_fopen_index(struct zip *, int, int)
' Open file in zip archive for reading by index
Private Extern zip_fopen_index(archive As Pointer, index As Integer, flags As Integer) As Pointer

' zip_int64_t zip_fread(struct zip_file *, void *, zip_uint64_t)
' Read from file.
Private Extern zip_fread(zfile As Pointer, buf As Byte[], nbytes As Long) As Long

' int zip_fclose(struct zip_file *)
' Close file in zip archive.
Private Extern zip_fclose(zfile As Pointer) As Integer

' int zip_close(struct zip *)
' Close zip archive.
Private Extern zip_close(archive As Pointer) As Integer


Public Sub Main()
 
 Dim percorsoZip, decompresso As String
 Dim z, zf As Pointer
 Dim i, lun As Integer
 Dim zs As New Zip_stat
 Dim l As Long
 Dim fl As File
 Dim buf As New Byte[64]
 
 percorsoZip = "/percorso/del/file.zip"
 decompresso = "/percorso/ove/saranno/estratti/i/file"
  
 z = zip_open(percorsoZip, 0, 0)
 If z == 0 Then
   zip_close(z)
   Error.Raise("Impossibile aprire un file '.zip' !")
 Endif
  
 For i = 0 To zip_get_num_entries(z, 0) - 1
   If zip_stat_index(z, i, 0, zs) = 0 Then
     lun = Len(String@(zs.name))
     Print "Nome:       "; String@(zs.name)
     Print "Dimensione: "; zs.size
     Print "mtime:      "; zs.mtime
     If Right(String@(zs.name), 1) = "/" Then
       Continue
     Else
       zf = zip_fopen_index(z, i, 0)
       If zf == 0 Then
         zip_fclose(zf)
         Error.Raise("Errore alla funzione 'zip_fopen_index()' !")
       Endif
       fl = Open decompresso &/ File.Name(String@(zs.name)) For Create
       While l < zs.size
         lun = zip_fread(zf, buf, 64)
         If lun < 0 Then Error.Raise("Errore nella lettura del file !")
         buf.Write(fl, 0, lun)
         l += lun
       Wend
       fl.Close
       zip_fclose(zf)
     Endif
   Endif       
 Next
  
 zip_close(z)
  
End


Riferimenti