VB - Backup - Compactando com o Winzip


Que tal compactar o seu banco de dados Access (*.mdb) durante a operação de Backup. Quem sabe ele assim vai caber no disquete!! . Vou mostrar uma rotina que faz exatamente isto; é bem simples , mas você pode incrementá-la para fazer além do que eu estou mostrando aqui.

1- Inicie um novor projeto no VB e no formulário padrão insira uma caixa de texto , um botão de comando , uma label , o controle CommonDialog , conforme tela abaixo :

2- Na seção - General Declarations - declara a API que vamos usar:

Private Declare Function ShellExecute Lib "Shell32" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation _
As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd _
As Long) As Long

3- No evento Load do formulário temos o código para configurar o commondialog com parâmetros iniciais.

Private Sub Form_Load()
  cmdlg1.InitDir = "c:\teste"
  cmdlg1.Filter = "Arquivos (*.mdb;*.dbf)|*.mdb;*.dbf |Texto (*.txt)|*.txt"
  cmdlg1.DefaultExt = "*.mdb"
End Sub

4- No evento Click do botão de comando temos o codigo abaixo: ele compacta o banco de dados antes de efetuar a compactação via WInZIP.

Private Sub Command1_Click()

On Error GoTo cmdBackup_Erro

Dim Msg As String
Dim arqDest As String
Dim arqTemp As String

If Len(Text1.Text) = 0 Or Text1.Text = "" Then
  MsgBox "Selecione um arquivo para Backup.", vbCritical, "Backup"
  Exit Sub
End If

arqTemp = "temp.dat"

'Compacta o BD antes do Backup.
Label1.Caption = "Compactando o arquivo " & Text1.Text & " ..."

DBEngine.CompactDatabase Text1.Text, arqTemp, , dbEncrypt
Label1.Caption = "Compactando o arquivo " & Text1.Text & " ... "

FileCopy arqTemp, Text1.Text 'sobrescreve com o arq. compactado.
DoEvents

Label1.Caption = "Arquivo compactado com sucesso!"

arqDest = Dir(Text1.Text) 'obtém o nome do arquivo.

'Altera o destino para um arquivo no drive A: com extensão Zip.
arqDest = "A:\" & Left(arqDest, Len(arqDest) - 3) & "zip"

If BackUp(Text1.Text, arqDest) Then 'executa o backup.
  MsgBox "Operação concluída!", vbInformation, "Backup"
Else
  MsgBox "Operação cancelada.", vbCritical, "Backup"
Exit Sub
End If

 Kill arqTemp 'apaga o arq. temporário.
Label1.Caption = "Arquivo compactado com sucesso!"
Exit Sub

cmdBackup_Erro:
 MsgBox "Erro nº " & Err.Number & vbCrLf & Err.Description, vbCritical, "Backup"

End Sub

5- Agora o código da função - Backup - : Ela chama o WInzip via API com a linha de comando montada : strRet = "C:\Arquivos de Programas\Winzip\Winzip32.exe -a -ef " & """" & arqDestino & """ " & """" & arqOrigem & """"

Function BackUp(arqOrigem As String, arqDestino As String) As Boolean
'É necessário abrir o mdb com acesso exclusivo.
On Error GoTo BackUp_Erro

Dim strRet As String
Dim retonro As Variant

If MsgBox("Insira um disco formatado na unidade A:" & vbCrLf _
 & "Prossegue com o Backup?", vbYesNo, "Efetua BackUp") = vbYes Then

  Label1.Caption = "Iniciando o backup do arquivo " & arqOrigem
  ' Parâmetros de Winzip32.exe:
  ' -a = adiciona arquivos.
  ' -ef = compactação rápida; ex = compactação máxima.
  ' As aspas são necessárias caso o diretório tenha espaços no nome.

  strRet = "C:\Arquivos de Programas\Winzip\Winzip32.exe -a -ef " _
  & """" & arqDestino & """ " & """" & arqOrigem & """"

  retorno = Shell(strRet, vbNormalNoFocus)
  BackUp = True

Else
  BackUp = False
End If

'A linha abaixo deve ser usada com o Arj.exe
'Call MeuShell("C:\Util\Arj.exe a -vva -r -y -i1 " _
'& """" & arqDestino & """ " & """" & arqOrigem & """", 1)

Exit Function

BackUp_Erro:
MsgBox "Erro nº " & Err.Number & vbCrLf & Err.Description, vbCritical, "Backup"

End Function

Voce pode também usar outro compactador como o PKZIP ou o ARJ ( veja no código a linha de comando para usar o ARJ).

Existe um incoveniente nesta rotina ; a janela do WInzip irá surgir e tomar conta do processo , assim se houver necessidade de mais de um disco o WInzip vai solicitar e você vai ter que confirmar. Veja abaixo:

Eu recomendo muito cuidado ao usar esta rotina ! ( para incrementá-la você pode usar outras API´s para verificar se o processo já esta terminado) .

Até a próxima dica ...