Ir para o conteúdo

Cópia assíncrona de ficheiros

Copiar ficheiros é relativamente fácil com VisualBasic .Net, pois a framework tem métodos que o fazem, mas o problema surge quando é preciso saber mais informação sobre a cópia, neste caso o progresso.


Começamos por definir os eventos que serão accionados durante a cópia, neste caso temos dois eventos, um para a mudança de progresso da cópia e outro para o final da cópia.

Private Event fileCopyProgressChanged(ByVal p As Integer)
Private Event fileCopyComplete()

De seguida definimos as sub-rotinas que são executadas quando os eventos são accionados. Para verificar o progresso da cópia usamos um Label e uma ProgressBar.

'sub-rotina que é executada quando o evento fileCopyProgressChanged for accionado
Private Sub fcProgress(ByVal p As Integer) Handles Me.fileCopyProgressChanged
    Label1.Text = p.ToString & " %" 
    ProgressBar1.Value = p 
End Sub

'sub-rotina que é executada quando o evento fileCopyComplete for accionado
Private Sub fcComplete() Handles Me.fileCopyComplete
    MsgBox("Cópia completa!")
End Sub

Por último apenas falta o método que faz a cópia.

    ''' <summary>
    ''' Copia um ficheiro de maneira assíncrona
    ''' </summary>
    ''' <param name="fPath">Path do ficheiro de origem</param>
    ''' <param name="fDest">Path de destino da cópia</param>
    ''' <remarks></remarks>
Private Sub fileCopy(ByVal fPath As String, ByVal fDest As String)
    Dim sReader As New IO.FileStream(fPath, IO.FileMode.Open)
    Dim sWriter As New IO.FileStream(fDest, IO.FileMode.Create)
    Dim len As Long = sReader.Length - 1 'É obtido o tamanho do ficheiro
    Dim buffer(1024) As Byte
    Dim bytesread As Integer

    'O ciclo While é executado até o tamanho lido ser igual ao tamanho do ficheiro
    While sReader.Position < len
        bytesread = (sReader.Read(buffer, 0, 1024))
        sWriter.Write(buffer, 0, bytesread)
        RaiseEvent fileCopyProgressChanged(CInt(sReader.Position / len * 100))
        Application.DoEvents()
    End While

    sWriter.Flush()
    sWriter.Close()
    sReader.Close()

    RaiseEvent fileCopyComplete()
End Sub

Este método recebe o caminho do ficheiro a copiar (fPath) e o destino da cópia (fDest). A cópia é feita por dois FileStream, em que um deles lê o ficheiro de origem e o outro escreve o ficheiro de destino.

Para copiar um ficheiro basta fazer:

fileCopy("Path do ficheiro de origem", "Path do destino")