Effettuare una copia di un file e verificarne la progressione

Da Gambas-it.org - Wikipedia.

Mostriamo in questa pagina due possibili modalità per effettuare una copia di un file e verificarne la progressione in percentuale.


Usando le sole risorse di Gambas

Vediamo una modalità che fa uso delle sole risorse di Gambas.

Con un'applicazione in ambiente grafico

Public Sub Button1_Click()
 
 Dim flOr, flCp As File
 Dim origo, copia As String
 Dim bb As Byte[]
 Dim quantum, lo As Integer
 Dim l As Long
   
  origo = "/percorso/del/file/da/copiare"
  copia = "/percorso/della/copia/del/file"
   
  flOr = Open origo For Read
   
  flCp = Open copia For Create
   
  lo = Lof(flOr) 
   
  quantum = lo \ 100
   
  bb = New Byte[quantum + (lo Mod 100)]
   
  While Not Eof(flOr)
    If lo - Seek(flOr) < quantum Then quantum = lo - Seek(flOr)
    bb.Read(flOr, 0, quantum)
    bb.Write(flCp, 0, quantum)
    l += quantum
    ProgressBar1.Value = ((l * 100) \ lo) / 100
    Wait 0.001
  Wend
   
  flCp.Close
  flOr.Close
  
End
  

Con un'applicazione a riga di comando

Public Sub Main()
 
 Dim flOr, flCp As File
 Dim origo, copia As String
 Dim bb As Byte[]
 Dim quantum, lo As Integer
 Dim l As Long
   
  origo = "/percorso/del/file/da/copiare"
  copia = "/percorso/della/copia/del/file"
   
  flOr = Open origo For Read
   
  flCp = Open copia For Create
   
  lo = Lof(flOr) 
   
  quantum = lo \ 100
   
  bb = New Byte[quantum + (lo Mod 100)]
   
  While Not Eof(flOr)
    If lo - Seek(flOr) < quantum Then quantum = lo - Seek(flOr)
    bb.Read(flOr, 0, quantum)
    bb.Write(flCp, 0, quantum)
    l += quantum
    Write #File.Out, "\r" & CStr((l * 100) \ lo) & "%"
  Wend
   
  flCp.Close
  flOr.Close
  
End


Usare le funzioni esterne del API di Libgio

Con le risorse della libreria Libgio è possibile effettuare la copia di un file e verificarne mano mano la progressione della copiatura.

E' necessario avere installata nel sistema e richiamare in Gambas la libreria dinamica condivisa: libgio-2.0.so.0.4002.0

Mostriamo un semplice esempio, in cui mentre viene effettuata la copia di un file, ne viene anche mostrata la progressione in una ProgressBar:

Library "libgio-2.0:0.4002.0"

Private Enum G_FILE_COPY_NONE = 0, G_FILE_COPY_OVERWRITE, G_FILE_COPY_BACKUP, G_FILE_COPY_NOFOLLOW_SYMLINKS,
             G_FILE_COPY_ALL_METADATA, G_FILE_COPY_NO_FALLBACK_FOR_MOVE, G_FILE_COPY_TARGET_DEFAULT_PERMS

' GFile * g_file_new_for_path (const char *path)
' Constructs a GFile for a given path.
Private Extern g_file_new_for_path(path As String) As Pointer

' gboolean g_file_copy (GFile *source, GFile *destination, GFileCopyFlags flags, GCancellable *cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, GError **error)
' Copies the file source to the location specified by destination.
Private Extern g_file_copy(source As Pointer, destination As Pointer, flags As Integer, cancellable As Pointer, callback As Pointer, callback_data As Pointer, GError As Pointer) As Boolean


Public Sub Form_Open()
 
 ProgressBar1.Value = 0.0
 
End


Public Sub Button1_Click()

 Dim origo, finis As String
 Dim ori, des, data As Pointer
 
   origo = "/percorso/del/file/origine/da/copiare"
   
   finis = "/percorso/della/copia/del/file"
   
   ori = g_file_new_for_path(origo)
   des = g_file_new_for_path(finis)
   
   g_file_copy(ori, des, G_FILE_COPY_OVERWRITE, 0, Progress, data, 0)
  
End


Public Function Progress(cur_bytes As Long, total_bytes As Long, data As Pointer)
  
 Dim value As Float
 
   If cur_bytes > 0 Then
     value = CFloat(cur_bytes) / CFloat(total_bytes)
     ProgressBar1.Value = value
     Wait 0.001
   Endif
 
End

Riferimenti