Differenze tra le versioni di "Effettuare una copia di un file e verificarne la progressione"

Da Gambas-it.org - Wikipedia.
 
(3 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
  
  
==Usando le sole risorse di Gambas==
+
=Usando le sole risorse di Gambas=
 
Vediamo una modalità che fa uso delle sole risorse di Gambas.
 
Vediamo una modalità che fa uso delle sole risorse di Gambas.
  
====Con un'applicazione in ambiente grafico====
+
===Con un'applicazione in ambiente grafico===
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
    
 
    
 
   Dim flOr, flCp As File
 
   Dim flOr, flCp As File
Riga 14: Riga 14:
 
   Dim l As Long
 
   Dim l As Long
 
      
 
      
  origo = "<FONT Color=gray>''/percorso/del/file/da/copiare''</font>"
+
  origo = "<FONT Color=darkgreen>''/percorso/del/file/da/copiare''</font>"
  copia = "<FONT Color=gray>''/percorso/della/copia/del/file''</font>"
+
  copia = "<FONT Color=darkgreen>''/percorso/della/copia/del/file''</font>"
 
      
 
      
  flOr = Open origo For Read
+
  flOr = Open origo For Read
 
      
 
      
  flCp = Open copia For Create
+
  flCp = Open copia For Create
 
      
 
      
  lo = Lof(flOr)  
+
  lo = Lof(flOr)  
 
      
 
      
  quantum = lo \ 100
+
  quantum = lo \ 100
 
      
 
      
  bb = New Byte[quantum + (lo Mod 100)]
+
  bb = New Byte[quantum + (lo Mod 100)]
 
      
 
      
  While Not Eof(flOr)
+
  While Not Eof(flOr)
    If lo - Seek(flOr) < quantum Then quantum = lo - Seek(flOr)
+
    If lo - Seek(flOr) < quantum Then quantum = lo - Seek(flOr)
    bb.Read(flOr, 0, quantum)
+
    bb.Read(flOr, 0, quantum)
    bb.Write(flCp, 0, quantum)
+
    bb.Write(flCp, 0, quantum)
    l += quantum
+
    l += quantum
    ProgressBar1.Value = ((l * 100) \ lo) / 100
+
    ProgressBar1.Value = ((l * 100) \ lo) / 100
    Wait 0.001
+
    Wait 0.001
  Wend
+
  Wend
 
      
 
      
  flCp.Close
+
  flCp.Close
  flOr.Close
+
  flOr.Close
 
 
'''End'''
 
 
    
 
    
 +
End
 +
  
====Con un'applicazione ''a riga di comando''====
+
===Con un'applicazione ''a riga di comando''===
  '''Public''' Sub Main()
+
  Public Sub Main()   <SUP>' &#091;[[#Note|nota 1]]&#093;</sup>
 
    
 
    
 
   Dim flOr, flCp As File
 
   Dim flOr, flCp As File
Riga 51: Riga 51:
 
   Dim l As Long
 
   Dim l As Long
 
      
 
      
  origo = "<FONT Color=gray>''/percorso/del/file/da/copiare''</font>"
+
  origo = "<FONT Color=darkgreen>''/percorso/del/file/da/copiare''</font>"
  copia = "<FONT Color=gray>''/percorso/della/copia/del/file''</font>"
+
  copia = "<FONT Color=darkgreen>''/percorso/della/copia/del/file''</font>"
 
      
 
      
  flOr = Open origo For Read
+
  flOr = Open origo For Read
 
      
 
      
  flCp = Open copia For Create
+
  flCp = Open copia For Create
 
      
 
      
  lo = Lof(flOr)  
+
  lo = Lof(flOr)  
 
      
 
      
  quantum = lo \ 100
+
  quantum = lo \ 100
 
      
 
      
  bb = New Byte[quantum + (lo Mod 100)]
+
  bb = New Byte[quantum + (lo Mod 100)]
 
      
 
      
  While Not Eof(flOr)
+
  While Not Eof(flOr)
    If lo - Seek(flOr) < quantum Then quantum = lo - Seek(flOr)
+
    If lo - Seek(flOr) < quantum Then quantum = lo - Seek(flOr)
    bb.Read(flOr, 0, quantum)
+
    bb.Read(flOr, 0, quantum)
    bb.Write(flCp, 0, quantum)
+
    bb.Write(flCp, 0, quantum)
    l += quantum
+
    l += quantum
    Write #File.Out, "\r" & CStr((l * 100) \ lo) & "%"
+
    Write "\r" & CStr((l * 100) \ lo) & "%"
  Wend
+
    Flush
 +
  Wend
 
      
 
      
  flCp.Close
+
  flCp.Close
  flOr.Close
+
  flOr.Close
 
    
 
    
  '''End'''
+
  End
  
  
 
+
=Usare le funzioni esterne del API di Libgio=
==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.
 
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 condivisa: "''libgio-2.0.so.0.6400.6'' ".
+
E' necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "''libgio-2.0.so.0.7200.4'' ".
  
 
Mostriamo un semplice esempio, in cui mentre viene effettuata la copia di un file, ne viene anche mostrata la progressione in una ''ProgressBar'':
 
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.6400.6"
+
  Library "libgio-2.0:0.7200.4"
 
   
 
   
 
  Private Enum G_FILE_COPY_NONE = 0, G_FILE_COPY_OVERWRITE, G_FILE_COPY_BACKUP, G_FILE_COPY_NOFOLLOW_SYMLINKS,
 
  Private Enum G_FILE_COPY_NONE = 0, G_FILE_COPY_OVERWRITE, G_FILE_COPY_BACKUP, G_FILE_COPY_NOFOLLOW_SYMLINKS,
Riga 99: Riga 99:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   ProgressBar1.Value = 0.0
 
   ProgressBar1.Value = 0.0
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim origo, finis As String
 
   Dim origo, finis As String
 
   Dim ori, des, data As Pointer
 
   Dim ori, des, data As Pointer
 
    
 
    
    origo = "<FONT Color=gray>''/percorso/del/file/origine/da/copiare''</font>"
+
  origo = "<FONT Color=darkgreen>''/percorso/del/file/origine/da/copiare''</font>"
   
+
  finis = "<FONT Color=darkgreen>''/percorso/della/copia/del/file''</font>"
    finis = "<FONT Color=gray>''/percorso/della/copia/del/file''</font>"
 
 
      
 
      
    ori = g_file_new_for_path(origo)
+
  ori = g_file_new_for_path(origo)
    des = g_file_new_for_path(finis)
+
  des = g_file_new_for_path(finis)
 
      
 
      
    g_file_copy(ori, des, G_FILE_COPY_OVERWRITE, 0, Progress, data, 0)
+
  g_file_copy(ori, des, G_FILE_COPY_OVERWRITE, 0, Progress, data, 0)
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Function Progress(cur_bytes As Long, total_bytes As Long, data As Pointer)
 
  '''Public''' Function Progress(cur_bytes As Long, total_bytes As Long, data As Pointer)
Riga 127: Riga 125:
 
   Dim value As Float
 
   Dim value As Float
 
    
 
    
    If cur_bytes > 0 Then
+
  If cur_bytes > 0 Then
      value = CFloat(cur_bytes) / CFloat(total_bytes)
+
    value = CFloat(cur_bytes) / CFloat(total_bytes)
      ProgressBar1.Value = value
+
    ProgressBar1.Value = value
      Wait 0.001
+
    Wait 0.001
    Endif
+
  Endif
 
    
 
    
  '''End'''
+
  End
 +
 
 +
 
 +
 
 +
=Riferimenti=
 +
* https://docs.gtk.org/gio/iface.File.html
 +
 
 +
 
  
====Riferimenti====
+
=Note=
* https://docs.gtk.org/gio/method.File.equal.html?q=g_file
+
[1] Vedasi anche questa pagina: [[Pseudo-ProgressBar in un'applicazione 'a riga di comando']]

Versione attuale delle 08:45, 14 dic 2023

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()   ' [nota 1]
 
 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 "\r" & CStr((l * 100) \ lo) & "%"
   Flush
 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 condivisa: "libgio-2.0.so.0.7200.4 ".

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.7200.4"

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


Note

[1] Vedasi anche questa pagina: Pseudo-ProgressBar in un'applicazione 'a riga di comando'