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

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
La libreria '''libzip'' consente di gestire file compressi ''.zip''.
 
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 dinamica condivisa: ''libzip.so.2.1.0''
+
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:
 
Mostriamo un esempio pratico per estrarre uno o più file contenuti in un file compresso .zip:
  Library "libzip:2.1.0"
+
  Library "libzip:5.0"
 
   
 
   
 
  Public Struct zip_stat
 
  Public Struct zip_stat
Riga 59: Riga 58:
 
   Dim buf As New Byte[64]
 
   Dim buf As New Byte[64]
 
    
 
    
  percorsoZip = "<FONT Color=gray>''/percorso/del/file.zip''</font>"
+
  percorsoZip = "<FONT Color=gray>''/percorso/del/file.zip''</font>"
  decompresso = "<FONT Color=gray>''/percorso/ove/saranno/estratti/i/file''</font>"
+
  decompresso = "<FONT Color=gray>''/percorso/ove/saranno/estratti/i/file''</font>"
 
    
 
    
  z = zip_open(percorsoZip, 0, 0)
+
  z = zip_open(percorsoZip, 0, 0)
  If z = 0 Then
+
  If z == 0 Then
    zip_close(z)
+
    zip_close(z)
    Error.Raise("Impossibile aprire un file '.zip' !")
+
    Error.Raise("Impossibile aprire un file '.zip' !")
  Endif
+
  Endif
 
    
 
    
  For i = 0 To zip_get_num_entries(z, 0) - 1
+
  For i = 0 To zip_get_num_entries(z, 0) - 1
     
+
    If zip_stat_index(z, i, 0, zs) = 0 Then
    If zip_stat_index(z, i, 0, zs) = 0 Then
+
      lun = Len(String@(zs.name))
      lun = Len(String@(zs.name))
+
      Print "Nome:      "; String@(zs.name)
      Print "Nome:      "; String@(zs.name)
+
      Print "Dimensione: "; zs.size
      Print "Dimensione: "; zs.size
+
      Print "mtime:      "; zs.mtime
      Print "mtime:      "; zs.mtime
+
      If Right(String@(zs.name), 1) = "/" Then
      If Right(String@(zs.name), 1) = "/" Then
+
        Continue
        Continue
+
      Else
      Else
+
        zf = zip_fopen_index(z, i, 0)
        zf = zip_fopen_index(z, i, 0)
+
        If zf == 0 Then
        If zf = 0 Then
+
          zip_fclose(zf)
          zip_fclose(zf)
+
          Error.Raise("Errore alla funzione 'zip_fopen_index()' !")
          Error.Raise("Errore alla funzione 'zip_fopen_index()' !")
+
        Endif
        Endif
+
        fl = Open decompresso &/ File.Name(String@(zs.name)) For Create
        fl = Open decompresso &/ File.Name(String@(zs.name)) For Create
+
        While l < zs.size
        While l < zs.size
+
          lun = zip_fread(zf, buf, 64)
          lun = zip_fread(zf, buf, 64)
+
          If lun < 0 Then Error.Raise("Errore nella lettura del file !")
          If lun < 0 Then Error.Raise("Errore nella lettura del file !")
+
          buf.Write(fl, 0, lun)
          buf.Write(fl, 0, lun)
+
          l += lun
          l += lun
+
        Wend
        Wend
+
        fl.Close
        fl.Close
+
        zip_fclose(zf)
        zip_fclose(zf)
+
      Endif
      Endif
+
    Endif      
    Endif
+
  Next
         
 
  Next
 
 
    
 
    
  zip_close(z)
+
  zip_close(z)
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  

Versione delle 18:22, 1 dic 2021

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