Effettuare una copia di un file e verificarne la progressione
Vai alla navigazione
Vai alla ricerca
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'