Há cerca de 2 anos, precisei encontrar uma forma de atualizar minha aplicação (HP-SIAC - Sistema de Automação Comercial), e já possuo instalado um servidor FTP (FileZilla
Server) em um notebook antigo (Celeron com 1 GB Ram).
OBS: Foi de fundamental importância a existência de um servidor local para os testes que realizei ao testar minha aplicação. Em meu servidor Ftp
tenho uma maquina virtual (Vbox) com um servidor filezzila instalado. O Arquivo é grande, mas com um pouco de paciência pode ser baixado. Procure também na internet,
existem excelentes tutoriais mostrando como instalar e configurar um servidor Ftp.
Inicialmente encontrei grande dificuldade em produzir um programa que, lê-se no servidor em uma determinada pasta, um conjunto de arquivos e executasse um conjunto de
tarefas para atualizar os programas e dados. Mas após montar uma colcha de retalhos, com pedaços de rotinas de diversos tutoriais, conseguir chegar a este resultado que aqui apresento
a vocês.
1. O funcionamento de um servidor FTP:
Um servidor Ftp realiza a comunicação através de uma porta (normalmente 21), onde obedece a uma série de comandos linha a linha. Para obter uma comunicação com o mesmo
deverá utilizar algum componente de comunicação (o ideal é o WinSock) e após realizar o protocolo de comunicação enviar comandos (SendData), através de uma string cujo o término
seja a seqüência chr(13)+chr(10).
Ex Winsock.SendData “LIST” & vbCrLf (busca a lista de arquivos da pasta atual).
Destaquei este artigo na internet onde é mostrado o funcionamento do FTP:http://balaiotecnologico.blogspot.com.br/2010/07/funcionamento-de-servicos-ftp.html
Bem, o importante é entender que precisaremos usar dois componentes WinSock para estabelecer a comunicação completa com o servidor. O primeiro, denominado de “Inet”,
terá a função de comunicação básica passando os comandos e recebendo as respostas do servidor. O segundo, denominado de “DataR”, terá a função de transferência dos dados de
arquivos existentes no servidor. Utilizarei o modo passivo, é mais simples deixar que o servidor escolha as portas.
2. O formulário Base e seus componentes:
Vamos então, detalhar o formulário principal e os componentes utilizados para que melhor possamos entender o código do programa:
Figura 1. Detalhando formulário
Figura 2. Project
Na estrutura do projeto vemos dois formulários (Altera e Atualhp). O formulário “Altera” é uma estrutura bem simples que chamo para visualizar o texto com o histórico das
atualizações de meu sistema. O formulário “AtualHp”, (Form main) é que será o objeto principal deste artigo. É nele que está inserido o código dos eventos e procedimentos que permite a
comunicação com o servidor e download dos arquivos.
Temos também, dois módulos com funções e procedimentos públicos. O módulo “Funções”, é todo desenvolvido por mim e possui uma série de funções que normalmente utilizo
em todos os meus projetos VB6 e VB.NET. Algumas destas funções detalho no meu código, para melhor esclarecimento do seu uso. No módulo “ModuloShell” possuo um procedimento
denominado “ExecCmd” que substitui o comando “Shell” do Vb (não é de minha autoria). Não vou me ater a explicá-lo, pois este não é o objetivo deste artigo, apenas mostro no código sua
forma de utilização e os efeitos causados no sistema.
OBS: A estrutura do projeto com todos arquivos utilizados encontra-se disponível para download em meu site, através de meu servidor FTP. Na
pasta FtpInet, você vai encontra-lo junto com uma máquina virtual com um servido Ftp já instalado. Você também irá encontrar (em outras pastas o meu aplicativo principal
(Setup-Hp-Siac-V7)),outros utilitários e programas utilizados por mim ao longo destes anos. Faça bom uso de todos eles. Quando for descompactado oarquivo FtpInet.zip,
que contêm o projeto será criada uma pasta (Ocx_Dll), que contêm componentes externos que precisam ser registrados com o RegSvr32 do windows.
3. O código do programa:
O código é todo comentado. Creio que é o suficiente para que o programador o utilize, ou ainda, copie parte de seu código para aproveita-lo em seus projetos. Por outro lado,
com pequenos ajustes creio que qualquer profissional da área irá se beneficiar do seu uso integral.
Listagem 1: Código completo
Option Explicit
'-------------------- Descrição das Variáveis do Sistema ----------------------
'
' NumArq% Numero arquivo aberto
' AllData$ Usada de forma genérica (ler os parâmetros iniciais do sistema)
' DadosRec$ Receber os dados do servidor Ftp
' Porta% Número da porta de comunicação de dados do servidor Ftp
' Lpos% Qtde de bytes recebidos na porta de comunicação
' RespSv$ String de Resposta do Servidor (importante para tomada de decisão)
' Temp$ Variável de uso genérico temporário
' X&,K& Variáveis inteiras usadas nos contadores e loops de forma genérica
' TipoDow% Armazena o tippo do download a ser realizado para tomada de decisão
' DadosOk Variável que armazena o estado da porta de dados do servidor
' NS% - Contador para saber o número do servidor
' Linhas() Usado para le linhas de texto de arquivos de textos externos.
' Servidor() Armazena o endereço dos servidores
' InetPort() Armazena a porta usada no servidor (normalmente 21)
' User() Armazena os Usuários
' Pass() Armazena as passwords dos usuários
'
' ------------------------------------------------------------------------------
' Obs: Outras variáveis são utilizadas durante os diversos processos que
' serão explicadas durante estes procedimentos. Determinei apenas 3 nós
' para os arrays que guardam os dados dos servidores pois não juguei
' necessidade para mais.
' ------------------------------------------------------------------------------
' São usados dois componentes Winsock (DataR e Inet) um para comunicação básica
' e o outro para fazer download de dados.
' --------------------------------------------------------------------------------------
' É importante frisar que parte destes códigos foram retirados de outras rotinas
' encontradas na internet e adaptadas as minhas necessidades.
' --------------------------------------------------------------------------------------
Dim AllData$, DadosRec$, Porta%, QtdV&, Lpos&, RespSv, Temp$, X&, K&
Dim Tipodow%, DadosOk As Boolean, NS%, NumArq%
Dim Linhas$(3), Servidor$(3), InetPort%(3), User$(3), Pass$(3)
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
' Evento Keydown do formulário
' Caso digite a tecla <esc> (codigo 27) sai do sistema
' caso digite a tecla <F8> troca o servidor (dados armazenados nos Arrays)
If KeyCode = 27 Then Unload Me
If KeyCode = 119 Then MudaServidor
End Sub
Private Sub Form_Unload(Cancel As Integer)
' Saida do Form fecho os dois controles Winsocks caso estejam abertos
Inet.Close
DataR.Close
End Sub
Private Sub Form_Load()
' A Funções Pc(), OpenArq(), LeLinhas(), GravaLinha, Vlm() são de minha autoria.
' Pc() - Separa os dados contidos em uma linha através de um delimitador
' [ Pc (Linha, Delimitador, Posição na linha) ].
' Vlm() - Parecido com o Val() só que analiza uma string e retorna o seu valor.
' OpeArq() - Abre um arquivo para leitura, gravação ou update
' [ OpenArq (Arquivo, Tipo) ].
' LeLinhas - Le o arquivo até o seu final armazenando suas linhas na matriz
' [ LeLinhas (NumArq, Matriz) ].
' GravaLinha - Grava no muero do arquivo o texto [ GravaLinha (NumArq, Texto) ].
' Outras funções estão contidas no modulo Funcoes mas seu estudo não se adequa ao
' momento.
' Eu as utilizo muito e é um resquicio da época em que fui programador em MUMPS
' Coloca o formulário principal no canto superior direito da tela e seta NS=1
' em seguida torna os botões VerfAtual e Atualiza desabilitados
Me.Top = 0: Me.Left = 0: NS = 1
VerfAtual.Enabled = False
Atualiza.Enabled = False
' ----------------------------------------------------------------------------------------------------------------------
' Como uso o atualizador para um sistema com 6 subsistemas utilizo o comando TaskKill
' para destruir as janelas dos programas caso elas estejam ligadas. Tentei fazer isso
' com API´s mas não obtive sucesso.
' -----------------------------------------------------------------------------------------------------------------------
Shell "taskkill /im contab.exe", vbMinimizedNoFocus
Shell "taskkill /im receber.exe", vbMinimizedNoFocus
Shell "taskkill /im pagar.exe", vbMinimizedNoFocus
Shell "taskkill /im estoque.exe", vbMinimizedNoFocus
Shell "taskkill /im vendas.exe", vbMinimizedNoFocus
Shell "taskkill /im compras.exe", vbMinimizedNoFocus
Shell "taskkill /im liberaepn.exe", vbMinimizedNoFocus
Shell "taskkill /im hp-siac.exe", vbMinimizedNoFocus
On Error Resume Next ' Caso ocorra algum erro durante este vai para o prox
' Seto X=1 e abro o arquivo Servidores.Txt contido no dir da aplicação para leitura.
' Leio os dados contidos no arquivo e armazeno nos arrays.
' A Funções Pc(), OpenArq(), LeLinhas(), GravaLinha, Vlm() são de minha autoria.
' Pc() - Separa os dados contidos em uma linha através de um delimitador
' [ Pc (Linha, Delimitador, Posição na linha) ].
' Vlm() - Parecido com o Val() só que analiza uma string e retorna o seu valor.
' OpeArq() - Abre um arquivo para leitura, gravação ou update
' [ OpenArq (Arquivo, Tipo) ].
' LeLinhas - Le o arquivo até o seu final armazenando suas linhas na matriz
' [ LeLinhas (NumArq, Matriz) ].
' GravaLinha - Grava no muero do arquivo o texto [ GravaLinha (NumArq, Texto) ].
' Outras funções estão contidas no modulo Funcoes mas seu estudo não se adequa ao
' momento.
' Eu as utilizo muito e é um resquicio da época em que fui programador em MUMPS
' Abre arquivo para leitura armazena em NumArq o numero
' Le todas as linhas do arquivo texto e armazena o numero de linhas em X
NumArq
...