07/05/2012

Copia de arquivos no VB6 com barra de progresso do Windows


Para aqueles que ainda programam em Visual Basic 6, como eu, vou dar uma dica fenomenal para cópia de arquivos grandes.

Normalmente, para copiar um arquivo, utilizamos o FileCopy, nativo do VB. Porém, essa opção não exibe uma barra de progresso e, desta forma, você não fica sabendo se o arquivo ainda está sendo copiado.

Nesta nova forma de realizar uma cópia, utilizaremos uma API.

Em um Módulo, coloque o seguinte código:
Option Explicit

Public Declare Function SHFileOperation Lib "shell32.dll" _
Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) _
As Long

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Const FO_COPY As Long = &H2
Public Const FOF_ALLOWUNDO As Long = &H40

Public Type SHFILEOPSTRUCT
    hWnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Boolean
    hNameMappings As Long
    lpszProgressTitle As String
End Type

Public Function CopyFile(Origem As String, Destino As String) As Boolean
    Dim RST As Long
    Dim FLOP As SHFILEOPSTRUCT

    FLOP.hWnd = 0
    FLOP.wFunc = FO_COPY
    
    'Arquivo de origem:
    FLOP.pFrom = Origem & vbNullChar & vbNullChar
    
    'Para copiar TODOS os arquivos, use:
    'FLOP.pFrom = "C:\*.*" & vbNullChar & vbNullChar
    
    'Diretório ou arquivo de destino:
    FLOP.pTo = Destino & vbNullChar & vbNullChar
    
    FLOP.fFlags = FOF_ALLOWUNDO
    
    RST = SHFileOperation(FLOP)
    If RST <> 0 Then
        'Erro na cópia
        MsgBox Err.Description, vbCritical Or vbOKOnly
        Exit Function
    Else
        If FLOP.fAnyOperationsAborted <> 0 Then
            MsgBox "Não foi possível realizar a cópia.", vbCritical Or vbOKOnly
            Exit Function
        End If
    End If
    
    'Um pequeno delay para aguardar o término da cópia.
    Call Sleep(1000)
    
    CopyFile = True
    
End Function


Para realizar a cópia, basta chamar a função CopyFile, conforme abaixo:
CopyFile "c:\downloads\meuarquivo.txt", "d:\temp"


Por hoje é só pessoal, um abraço a todos e até o próximo post!


2 comentários:

Anônimo disse...

Clássico!!!

Anônimo disse...

Existe uma forma de desabilitar o botão cancelar na hora de copiar?