CISA FotoGallery

Statistiche

Tot. visite contenuti : 927985
Home Articoli tecnici API Effettuare Copia di File con stato di Avanzamento....

Effettuare Copia di File con stato di Avanzamento....

Per la copia dei File specie se di grosse dimensioni sarebbe utile avere a disposizione la barra di progressione o almeno la percentuale di avanzamento dell'azione...!

Per questo si può sfruttare la fuzione di Apertura di un file in formato Binario
e la scrittura sequenziale....!
Questa tecnica è pessima per prestazioni.

Le API ci mettono a disposizione una funzione estesa che consente la copia di un file esistene in un nuovo preservando completamente gli Extended Attribute, solamente gli attributi di sicurezza non vengono copiati....!

CopyFileEx
Questa funzione consete di passare come parametro una funzione di CallBack, che nel nostro caso sfruttiamo proprio per l'aggiornamento dello stato di avanzamento della copia.

CODICE


' ==========================================
' Codice da mettere nella Maschera
' ==========================================

Option Compare Database
Option Explicit

Private Const
EVENTLOG_SUCCESS = &H0
Private Const EVENTLOG_ERROR_TYPE = &H1
Private Const EVENTLOG_WARNING_TYPE = &H2
Private Const EVENTLOG_INFORMATION_TYPE = &H4
Private Const EVENTLOG_AUDIT_SUCCESS = &H8
Private Const EVENTLOG_AUDIT_FAILURE = &H10
Private Const EVENTLOG_SEQUENTIAL_READ = &H1

Private Sub cmdStart_Click()
   Dim ret
   'Inizia la fase di Copia
   
ret = CopyFileEx("C:\FileOr.pdf", "C:\FileDest.pdf", _
                       AddressOf CopyProgressRoutine, _
                       ByVal 0&, _
                       bCancel, _
                       COPY_FILE_RESTARTABLE)
   'Mostra l'esito
   
Me.lblCopy.Caption = "Filecopy completed " + IIf(ret = 0, "(ERROR/ABORTED)", "successfully")
End Sub

Private Sub
cmdStop_Click()
    'Interagisce con la Funzione di CallBack per Abortire la Copia
    
bCancel = 1
End Sub

' ==========================================
' Codice da mettere in un Modulo Standard
' ==========================================
Option Compare Database
Option Explicit

Public Const
PROGRESS_CANCEL = 1
Public Const PROGRESS_CONTINUE = 0
Public Const PROGRESS_QUIET = 3
Public Const PROGRESS_STOP = 2
Public Const COPY_FILE_FAIL_IF_EXISTS = &H1
Public Const COPY_FILE_RESTARTABLE = &H2

Public Declare Function CopyFileEx Lib "kernel32.dll" _
                        Alias "CopyFileExA" _
                        (ByVal lpExistingFileName As String, _
                        ByVal lpNewFileName As String, _
                        ByVal lpProgressRoutine As Long, _
                        lpData As Any, _
                        ByRef pbCancel As Long, _
                        ByVal dwCopyFlags As Long) As Long

' Variabile per l'annullamento dell'Azione
Public bCancel As Long

Public Function
CopyProgressRoutine(ByVal TotalFileSize As Currency, _
                        ByVal TotalBytesTransferred As Currency, _
                        ByVal StreamSize As Currency, _
                        ByVal StreamBytesTransferred As Currency, _
                        ByVal dwStreamNumber As Long, _
                        ByVal dwCallbackReason As Long, _
                        ByVal hSourceFile As Long, _
                        ByVal hDestinationFile As Long, _
                        ByVal lpData As Long) As Long
    
'Aggiorna la Caption nella Form Attiva
    
Screen.ActiveForm.Caption = CStr(Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100)) + "% complete..."
    'Consente iterazioni utente(come il Pulsante di STOP)
    
DoEvents
    
'prosegue la copia
    
CopyProgressRoutine = PROGRESS_CONTINUE
End Function


Alessandro