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.
Indice
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'