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.
(Creata pagina con "La libreria '''libzip'' consente di gestire file compressi ''.zip''. Per poter fruire in gambas delle risorse della libreria ''libzip'', è necessario installare e richiamare...")
 
Riga 56: Riga 56:
 
   Dim buf As New Byte[100]
 
   Dim buf As New Byte[100]
 
    
 
    
   percorso = "''/percorso/del/file.zip''"
+
   percorsoZip = "''/percorso/del/file.zip''"
 +
  decompresso = "''/percorso/ove/saranno/estratti/i/file''"
 
    
 
    
 
   z = zip_open(percorso, 0, 0)
 
   z = zip_open(percorso, 0, 0)
Riga 73: Riga 74:
 
         zf = zip_fopen_index(z, i, 0)
 
         zf = zip_fopen_index(z, i, 0)
 
         If IsNull(zf) Then Error.Raise("Errore alla funzione 'zip_fopen_index()' !")
 
         If IsNull(zf) Then Error.Raise("Errore alla funzione 'zip_fopen_index()' !")
         fl = Open "/tmp" &/ String@(zs.name) For Create
+
         fl = Open decompresso &/ String@(zs.name) For Create
 
         While l < zs.size
 
         While l < zs.size
 
           lun = zip_fread(zf, buf, 100)
 
           lun = zip_fread(zf, buf, 100)

Versione delle 06:02, 10 nov 2015

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


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

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


Library "libzip:2.1.0"

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

' zip_int64_t zip_get_num_entries(zip_t *archive, zip_flags_t flags)
' 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 *za, int index, int flags, struct zip_stat *st)
' Get information about file by index.
Private Extern zip_stat_index(za As Pointer, index As Integer, flags As Integer, zst As Zip_stat) As Integer

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

' ssize_t zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
' Read from file.
Private Extern zip_fread(zf As Pointer, outbuf As Byte[], toread As Pointer) As Long

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


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[100]
 
  percorsoZip = "/percorso/del/file.zip"
  decompresso = "/percorso/ove/saranno/estratti/i/file"
  
  z = zip_open(percorso, 0, 0)
  If IsNull(z) Then Error.Raise("Impossibile aprire un file '.zip' !")
  
  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
        Mkdir String@(zs.name)
      Else
        zf = zip_fopen_index(z, i, 0)
        If IsNull(zf) Then Error.Raise("Errore alla funzione 'zip_fopen_index()' !")
        fl = Open decompresso &/ String@(zs.name) For Create
        While l < zs.size
          lun = zip_fread(zf, buf, 100)
          If lun < 0 Then Error.Raise("Errore nella lettura del file !")
          buf.Write(fl, 0, lun)
          l += lun
        Wend
      Endif
    Endif
          
  Next
   
  fl.Close
  zip_fclose(zf)
  
End



Riferimenti