Dois Exemplos de FTP - DownLoad

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Dois Exemplos de FTP - DownLoad

Mensagem por sygecom »

Exemplo 01(Inicia na surdina, só avisa se tiver nova versão)

Código: Selecionar todos

#include "windows.ch"
#include "guilib.ch"
#include "hwgui.ch"

***********************
Function Baixa_Automatico
***********************
if Inetestaconectada()=.T.  // verefica a conexão com a internet
   StartThread( @Donwload_Auto(),"1.0")  // tem que compilar em MT, para rodar na surdina
endif
Return

****************************
Function Donwload_Auto(vVersao)
****************************
Private vBaixa:="N"
ftpproto ="ftp://"
ftpserver = "ftp.servidor.com.br"
ftpuser = "usuario"
ftppass = "senha"
curl:=ftpproto+ftpuser+":"+ftppass+"@"+ftpserver
oUrl:= turl():new(curl)
oCred:= tIPCredentials()
oFtp:= tipclientftp():NEW(oUrl,,.T.)
oFTP:nConnTimeout := 20000
oFTP:bUsePasv     := .T.
IF oFTP:Open()
   oFTP:Cwd("www/pasta/sistema")     // muda o diretorio no FTP
   IF !empty(clista:=oFTP:List())
      oFtp:DownLoadFile("update\versao.txt") // baixa o arquivo versão.txt dentro da pasta update

      HAND=FOPEN("update\versao.txt")
      VERSAODISP=FREADSTR(HAND,4)       // verefica a versão
      FCLOSE(HAND)
      ferase("update\versao.txt")       // apaga o arquivo baixado

      IF VAL(VERSAODISP) > VAL(vVersao)  // verefica se tem versão disponivel
         IF MsgYesNo("Há uma Nova Atualização Disponivel, deseja Atualizar Agora ?")

            cTamanho:=oFTP:fileSize( "sistema.exe" )
            Inicia_Progress("update\sistema.exe",cTamanho,"sistema.exe")  // mostra o progressp na tela

            IF File("update\sistema.exe")
               Private oDlgHabla:=nil
               MsgRun("Aguarde...Fechando conexão com Servidor..." )
               oFTP:CLOSE()  // fechando conexão com o FTP
               HW_Atualiza_Dialogo("Aguarde...Renomeando Arquivos Baixados..." )
               RenameFile(NomeExecutavel(),"sistema2.exe" )
               HW_Atualiza_Dialogo("Aguarde...Copiando Arquivos Baixados para pasta SISTEMA.." )
               __CopyFile("update\sistema.exe",NomeExecutavel(.t.))
               HW_Atualiza_Dialogo("Aguarde...Limpando arquivos Temporarios..." )
               Ferase("update\sistema.exe")
               MsgInfo("O Sistema vai fechar essa sessão para Validar a atualização","Aviso do Sistema")
               WinExec("SISTEMA.EXE 2",.T.)  // 2=Não verefica se já esta aberto o sistema.
               Fim_Run()
               quit
            Endif
         Endif
      ENDIF
   ENDIF
   oFTP:CLOSE()
ENDIF
Return
Exemplo 02:

Código: Selecionar todos

#include "windows.ch"
#include "guilib.ch"
#include "hwgui.ch"

******************
Function Baixa_Arq
******************
Baixa_Arq2("1.0")

IF File("update\sistema.exe")
   Private oDlgHabla:=nil
   MsgRun("Aguarde...Renomeando Arquivos Baixados..." )
   RenameFile(NomeExecutavel(),"sistema2.exe" )
   HW_Atualiza_Dialogo("Aguarde...Copiando Arquivos Baixados para pasta SISTEMA.." )
   __CopyFile("update\sistema.exe",NomeExecutavel(.t.))
   HW_Atualiza_Dialogo("Aguarde...Limpando arquivos Temporarios..." )
   Ferase("update\sistema.exe")
   MsgInfo("O Sistema vai fechar essa sessão para Validar a atualização","Aviso do Sistema")
   HW_Atualiza_Dialogo("Aguarde...Limpando arquivos Temporarios..." )
   WinExec("sistema.exe 2",.T.)
   Fim_Run()
   quit
ELSE
   IF !FILE("update\Not_Update.txt")
      MsgInfo("Parabéns ! Você Já esta utilizando a versão mais recente do [ SISTEMA ] e portanto não há atualizações disponível.","Aviso do Sistema")
      FERASE("update\Not_Update.txt")
   ELSE
      FERASE("update\Not_Update.txt")
   ENDIF
Endif
Return NIL

***************************
Function Baixa_Arq2(vVERSAO)
***************************
SET DATE BRITISH
SET EPOCH TO 2000
Private oDlgHabla:=nil
MsgRun("Aguarde Vereficando conexão com a Internet..." )

IF Inetestaconectada()=.T.
   Fim_Run()
   IF !FILE("res\buscar.bmp")
      Donwload_File("www/pasta/sistema","buscar.bmp","res\buscar.bmp")
   Endif
   IF !FILE("res\sygecom.bmp")
      Donwload_File("www/pasta/sistema","sygecom.bmp","res\sygecom.bmp")
   Endif
   Donwload_File("www/pasta/sistema","sistema.exe","update\sistema.EXE")
else
   Fim_Run()
   MsgInfo("Não foi possível estabelecer uma conexão com o Servidor,Favor vereficar sua Intenet ou tente mais tarde.","Aviso do Sistema")
Endif
Return
**********************************************
Function Donwload_File(ftpdir,ftpfile,fdestino)
**********************************************
Private oDlgHabla:=nil
MsgRun("Aguarde Procurando Atualizações...")
Private vBaixa:="N"
ftpproto ="ftp://"
ftpserver = "ftp.servidor.com.br"
ftpuser = "usuario"
ftppass = "senha"
curl:=ftpproto+ftpuser+":"+ftppass+"@"+ftpserver
oUrl:= turl():new(curl)
oCred:= tIPCredentials()
oFtp:= tipclientftp():NEW(oUrl,,.T.)
oFTP:nConnTimeout := 20000
oFTP:bUsePasv     := .T.
IF oFTP:Open()
   oFTP:Cwd(ftpdir)     // muda o diretorio
   IF !empty(clista:=oFTP:List())
      IF ftpfile="sistema.exe"
         ferase("update\versao.txt")
         oFtp:DownLoadFile("update\versao.txt")
         oFTP:reset()
         oFtp:DownLoadFile("update\versao.txt")

         HAND=FOPEN("update\versao.txt")
         VERSAODISP=FREADSTR(HAND,4) // Le os 4 primeiros bytes do aquivo baixado
         FCLOSE(HAND)
         ferase("update\versao.txt")

         IF VAL(VERSAODISP) > VAL(vCOMPILA)
            vBaixa="S"
         ENDIF
      else
         vBaixa="S"
      endif
      IF vBaixa="S"
         Fim_Run()
         IF MsgYesNo("Há uma Nova Atualização Disponivel, deseja Atualizar Agora ?")

            cTamanho:=oFTP:fileSize( ftpfile )
            Inicia_Progress(fdestino,cTamanho,ftpfile)
         ELSE
            arq="update\Not_Update.txt"
            if !file(arq)
               arqh=fcreate(arq,0)
               fclose(arqh)
            endif
            rele arq, arqh
         Endif
      ENDIF
   ENDIF
   oFTP:CLOSE()
Else
   MsgInfo("Não foi possivel se conectar ao servidor, Favor tente mais tarde.","Aviso do Sistema")
ENDIF
Fim_Run()
Return
Funções Extras:

Código: Selecionar todos

*************************************************
Function Inicia_Progress(fdestino,wTotal,ftpfile)
*************************************************
Private oDlgHabla:=nil
MsgRun("Conectando, Aguarde...")
oFtp:exGauge := { | done, size| ShowGauge(done, size, wTotal, ftpfile ) }
oFtp:DownLoadFile(fdestino)
Fim_Run()

**************************************************
Function ShowGauge( nSent, nSize, wTotal, ftpfile )
**************************************************
GTprocessmessages()
HW_Atualiza_Dialogo(ftpfile+" "+ STR(nSent)+" Byts de: " + str(wTotal)+ " Byts "+str((nSent/wTotal)*100) +" %" )
Return


FUNCTION MsgRun( cMsg,cTime )
   Local vModal,vMsg:=[Aguarde em processamento....],vMsg2:=[]
   Local oFonte:= oFonte:= HFont():Add( "Arial"     , 0 ,-15,500,255 )
   PRIVATE oTimHabla
   if cMsg#nil
      vMsg:=cMsg
   endif

   INIT DIALOG oDlgHabla ;
   SIZE 485, 80  ;
   STYLE DS_CENTER + WS_VISIBLE ;
   ON INIT { || IniDlgHabla(cTime) } ;
   ON EXIT { || Hw_FimDialogoTemporal(cTime) }

   @ 0, 20  SAY vMsg SIZE 465, 20 STYLE SS_CENTER FONT oFonte

   if ctime=nil
      vModal:=.t.
   endif
   oDlgHabla:Activate(vModal)
Return .T.

static FUNCTION IniDlgHabla(cTime)
oDlgHabla:Center()
if cTime#nil
   SET TIMER oTimHabla OF oDlgHabla ID 9006 VALUE cTime ACTION {|| CierraDialogo() }
endif
Return .T.

FUNCTION Hw_FimDialogoTemporal(cTime)
if cTime#nil
   if oDlgHabla#nil
      oDlgHabla:close()
      oDlgHabla:=nil
   endif
endif
Return .T.

Function Fim_Run()
IF oDlgHabla#NIL
   oDlgHabla:CLOSE()
ENDIF

FUNCTION CierraDialogo()
   EndDialog()
RETURN .T.

FUNCTION HW_Atualiza_Dialogo(vMensagem)
GTprocessmessages()
oDlgHabla:ACONTROLS[1]:SETTEXT(vMensagem)
RETURN NIL

**************************************
Function inetestaconectada( cAddress )
**************************************
LOCAL aHosts
LOCAL cName
InetInit()
IF cAddress == NIL
   cAddress := "www.google.com.br"
ENDIF
aHosts := InetGetHosts( cAddress )
IF aHosts == NIL .or. len(aHosts)=0
   InetCleanup()
   RETURN .f.
endif
InetCleanup()
RETURN .t.
Obs: tem que linkar a TIP.LIB
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Mensagem por marcos.gurupi »

Amigo!!! Como vc adivinhou? Eu estava precisando justamente disso. Vou fazer os testes. Obrigado!

Marcos Roberto.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Postei pq um colega na sessão xharbour estava querendo, Qualquer coisa prende o grito !
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Mensagem por marcos.gurupi »

Por varios motivos q vcs (programadores) colegas sabem somente hoje eu comecei a testar as funcoes de ftp postadas, mas esta apresentando o seguinte erro logo no inicio:

Error BASE/1066 Argument error: conditional
Called from ftpcln.prg->TIPCLIENTFTP:NEW(116)
Called from PDVNET.PRG->DONWLOAD_FILE(887)
Called from PDVNET.PRG->BAIXA_ARQ2(863)
Called from PDVNET.PRG->(b)MAIN(338)
Called from ->ONCOMMAND(426)
Called from hwindow.prg->(b)HMAINWINDOW(155)
Called from hwindow.prg->HMAINWINDOW:ONEVENT(234)
Called from ->HWG_ACTIVATEMAINWINDOW(0)
Called from hwindow.prg->HMAINWINDOW:ACTIVATE(223)
Called from PDVNET.PRG->MAIN(349)

HwGUI 2.16 xHarbour build 0.99.70 Intl. (SimpLex)
Date:19/03/2008
Time:14:20:18
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

marcos.gurupi escreveu:Por varios motivos q vcs (programadores) colegas sabem somente hoje eu comecei a testar as funcoes de ftp postadas, mas esta apresentando o seguinte erro logo no inicio:

Error BASE/1066 Argument error: conditional
Called from ftpcln.prg->TIPCLIENTFTP:NEW(116)
Called from PDVNET.PRG->DONWLOAD_FILE(887)
Called from PDVNET.PRG->BAIXA_ARQ2(863)
Called from PDVNET.PRG->(b)MAIN(338)
Called from ->ONCOMMAND(426)
Called from hwindow.prg->(b)HMAINWINDOW(155)
Called from hwindow.prg->HMAINWINDOW:ONEVENT(234)
Called from ->HWG_ACTIVATEMAINWINDOW(0)
Called from hwindow.prg->HMAINWINDOW:ACTIVATE(223)
Called from PDVNET.PRG->MAIN(349)

HwGUI 2.16 xHarbour build 0.99.70 Intl. (SimpLex)
Date:19/03/2008
Time:14:20:18
O Exemplo acima foi postado para ser usado com xharbour 1.0.0, se queres usar com xharbour 9970, deve alterar a linha "tipclientftp()" por "tipclient()"
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Mensagem por marcos.gurupi »

Quando eu uso o comando cTamanho:=oFTP:fileSize( ftpfile ) ele apresenta o seguinte erro:

Código: Selecionar todos

Error BASE/1004  Message not found: TIPCLIENTFTP:FILESIZE
Called from ->TIPCLIENTFTP:ERROR(179)
Called from tobject.prg->(b)HBOBJECT:HBOBJECT(105)
Called from ->TIPCLIENTFTP:MSGNOTFOUND(0)
Called from ftpcln.prg->TIPCLIENTFTP:FILESIZE(167)
Called from PDVNET.PRG->DONWLOAD_FILE(1094)
Called from PDVNET.PRG->BAIXA_ARQ2(1057)
Called from PDVNET.PRG->(b)MAIN(343)
Called from ->ONCOMMAND(426)
Called from hwindow.prg->(b)HMAINWINDOW(155)
Called from hwindow.prg->HMAINWINDOW:ONEVENT(234)
Called from ->HWG_ACTIVATEMAINWINDOW(0)
Called from hwindow.prg->HMAINWINDOW:ACTIVATE(223)
Called from PDVNET.PRG->MAIN(357)

HwGUI 2.16 xHarbour build 0.99.70 Intl. (SimpLex)
Date:25/03/2008
Time:11:35:48
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

O Exemplo acima foi postado para ser usado com xharbour 1.0.0, se queres usar com xharbour 9970, deve alterar a linha "tipclientftp()" por "tipclient()"
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Mensagem por marcos.gurupi »

Caro leonardo a linha jah foi alterada e n ocorre mais erro o erro descrito acima se refere a outro q n saberia explicar o motivo.

A linha alterada anteriormente:

//oFtp:= tipclientftp():NEW(oUrl,,.T.) // xhb 1.0.0
oFtp:= tipclient():NEW(oUrl,,.T.) //xhb 0.99.70

A linha do err atual:

cTamanho:=oFTP:fileSize(ftpFile)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Que estranho marcos, pq pelo ERRO vc esta uando a TIP.LIB da 1.0.0 . Verefique se a sua TIP.LIB é da versão 9970 !
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Re: Dois Exemplos de FTP - DownLoad

Mensagem por Mário Isa »

Leonardo disse:
StartThread( @Donwload_Auto(),"1.0") // tem que compilar em MT, para rodar na surdina
O que significa MT ?

Mário
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Dois Exemplos de FTP - DownLoad

Mensagem por Maligno »

MultiTarefa.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Dois Exemplos de FTP - DownLoad

Mensagem por Abel »

Maligno, estou tentado fazer uma rotina para baixar uma EXE do site.
ao testar os exemplos postados da erro de compilacao, talvez porque muitas destas estao para xharbour e nao harbour como estou usando.

Analisando a wapi.exe vi que tem um comando para baixar um arquivo atraves do http, fiz um teste pela linha de comando do msdos e deu certo., minha duvida é se seria possivel compilar junto com harbour alguma parte do fonte evitando assim ter que executar um EXE que pode ser bloqueado por diversos antivirus existentes hoje.

grato pela atencao,
ABEL
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Dois Exemplos de FTP - DownLoad

Mensagem por Pablo César »

Analisando a wapi.exe vi que tem um comando para baixar um arquivo atraves do http, fiz um teste pela linha de comando do msdos e deu certo., minha duvida é se seria possivel compilar junto com harbour alguma parte do fonte evitando assim ter que executar um EXE que pode ser bloqueado por diversos antivirus existentes hoje.
Eu vou te responder pelo Maligno (ele anda meio ausente ultimamente). A biblioteca WAPI.LIB foi desenvolvida para uso exclusivo no Clipper, portanto não daria para ser compilada em Harbour ou xHarbour. O que pode é ser utilizada desde a sua aplicação Harbour ou xHarbour, mandando executar o WAPI.EXE e utilizá-lo como um aplicativo externo, da mesma forma que você fez para executar na linha de comando. O WAPI, possui todos os fontes utilizados, na maioria em linguagem C++, talvez daria para adaptar-lo de forma que você pudesse utilizar as funções em C de dentro da sua aplicação Harbour. Mas isso iria demandar em algumas adaptações em linguagem ANSI (puro C), apesar que aqui no fórum já foi mencionado que é possível utilizar C++ e até mesmo Assembler.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Dois Exemplos de FTP - DownLoad

Mensagem por Toledo »

Abel escreveu:ao testar os exemplos postados da erro de compilacao, talvez porque muitas destas estao para xharbour e nao harbour como estou usando.
Abel, os exemplos que o Leonardo passou funciona sim com Harbour. Então se você tem acesso ao FTP (conta de FTP, usuário e senha) deste site onde está o arquivo EXE que você quer baixar, você pode usar o exemplo Donwload_Auto() que o Leonardo postou na primeira mensagem deste tópico:

Código: Selecionar todos

Function Donwload_Auto()
****************************
ftpproto ="ftp://"
ftpserver = "ftp.servidor.com.br"  //endereço de FTP do site
ftpuser = "usuario"   //Usuário da conta FTP
ftppass = "senha"    //Senha da conta FTP
curl:=ftpproto+ftpuser+":"+ftppass+"@"+ftpserver
oUrl:= turl():new(curl)
oCred:= tIPCredentials()
oFtp:= tipclientftp():NEW(oUrl,,.T.)
oFTP:nConnTimeout := 20000
oFTP:bUsePasv     := .T.
IF oFTP:Open()
   oFTP:Cwd("www/pasta/sistema")     // informe o diretorio (no site) onde está o arquivo EXE que voce vai copiar
   IF !empty(clista:=oFTP:List())
      oFtp:DownLoadFile("arquivo.exe")  //informe o nome do arquivo que você quer baixar
   ENDIF
   oFTP:Close()
ENDIF
Return
Compile com a lib HBTIP.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

Pessoal, estou testando usar o FTP diretamente de dentro do xHarbour. Pesquisando no fórum, achei este post com este exemplo e fui testar.

Achei ele ótimo, funcionou beleza.

Só precisava saber quais os comandos para colocar arquivo no FTP usando esta função e também para excluir arquivos do FTP.

Alguém poderia me ajudar?
Inacio de Carvalho Neto
Responder