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")