Selecionar todos arquivos de uma pasta FTP

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Selecionar todos arquivos de uma pasta FTP

Mensagem por gilbertosilverio »

Ola amigos,

Baseado em exemplos do forum montei esta rotina para importa e exporta arquivos via FTP.

Minha duvida:
Como faço para baixar todos os arquivos de uma pasta FTP, sem saber o nome dos arquivos que por ventura estejam nela.

Desta maneira que esta abaixo, consigo enviar e receber os arquivos que SEI o nome, o que preciso e pegar arquivos de uma pasta sem saber os nomes que podem variar.

Ja tentei, como oFTP:LIST(), oFTP:LISTFILES(), mais sem sucesso.

Os dois metodos retornam:

20141029-20:57:41 :INETRECVALL( 2B30544, , 512 )
>> 10-29-14 04:49PM 21 TesteFtp.txt
10-29-14 04:49PM 21 TesteFtp01.txt

mais não copiam o arquivo.

Ja tentei tratar mais não consegui fazer o download deles.

Se alguém pudesse corrigir esta rotina...

Código: Selecionar todos


   FUNCTION TESTA_DOWN()
  clear
   ALERTPRETO([Voce deseja],{[  Enviar ],[ Receber ]},1)
   IF nOPT = 1
       Upload_FTP([TesteFPT.txt]  )
   ELSE
        DownLoad_FTP()
   ENDIF
   CLEAR
RETURN NIL

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>

function DownLoad_FTP()
   LOCAL lRetVal := .T.
   LOCAL aFiles, cFile
   LOCAL oFTP, oURL, cFILESPEC


 IF ! Empty( aFiles := { [TesteFtp.txt],[TesteFtp01.txt] } )

     cServer   := "192.168.1.132"
     cUser     := "Gilberto64"
     cPassword := "cla"

     cUrl      := "ftp://" + cUser + ":" + cPassword + "@" + cServer

     oURL := TUrl():New( cURL )

     oFTP := TIPClientFTP():New( oURL, .T. )
     oFTP:nConnTimeout := 20000
     oFTP:bUsePasv := .T.

     IF oFTP:Open( cURL )

        FOR EACH cFile IN aFiles
           ? "Filename:", cFile
           IF oFtp:DownloadFile( cFile )
            //oFtp:Dele( cFILE )
              lRetVal := .T.
           ELSE
              lRetVal := .F.
              EXIT
           ENDIF
         NEXT
         oFTP:Close()
     ELSE
        ? "Could not connect to FTP server", oURL:cServer
        IF oFTP:SocketCon == NIL
           ? "Connection not initialized"
        ELSEIF inetErrorCode( oFTP:SocketCon ) == 0
           ? "Server response:", oFTP:cReply
        ELSE
           ? "Error in connection:", inetErrorDesc( oFTP:SocketCon )
        ENDIF
        lRetVal := .F.
     ENDIF
// ENDIF

   ErrorLevel( iif( lRetVal, 0, 1 ) )

RETURN

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>

FUNCTION Upload_FTP( )

   LOCAL aFiles, cFile
   LOCAL oFTP, oURL

   /* fetch files to transfer */
   IF !Empty( aFiles := { [TesteFtp.txt] } )

     cServer   := "192.168.1.132"
     cUser     := "Gilberto64"
     cPassword := "cla"

     cUrl      := "ftp://" + cUser + ":" + cPassword + "@" + cServer

     oURL := TUrl():New( cURL )

     oFTP := TIPClientFTP():New( oURL, .T. )
     oFTP:nConnTimeout := 20000
     oFTP:bUsePasv := .T.

     IF oFTP:Open( cURL )
        FOR EACH cFile IN aFiles
           ? "Filename:", cFile
           IF !oFtp:UploadFile( cFile )
              lRetVal := .F.
              EXIT
           ELSE
              lRetVal := .T.
           ENDIF
         NEXT
         oFTP:Close()
     ELSE
        ? "Could not connect to FTP server", oURL:cServer
        IF oFTP:SocketCon == NIL
           ? "Connection not initialized"
         ELSEIF inetErrorCode( oFTP:SocketCon ) == 0
           ? "Server response:", oFTP:cReply
         ELSE
           ? "Error in connection:", inetErrorDesc( oFTP:SocketCon )
         ENDIF
         lRetVal := .F.
     ENDIF
   ENDIF

   ErrorLevel( iif( lRetVal, 0, 1 ) )

RETURN
Agradeço a ajuda.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Selecionar todos arquivos de uma pasta FTP

Mensagem por Jairo Maia »

Olá Gilberto,

Me pareceu confuso seu exemplo, mas veja se este exemplo ajuda:

Código: Selecionar todos

/*
  Compilar: Hbmk2 exemplo.prg -lhbtip
*/

Function Main()

 Local oFtp, aFile, cMsg, cPc, cOpc

 Local cLogin :=      // coloque aqui seu login
 Local cSenha :=      // coloque aqui sua senha
 Local cServidor :=   // ftp.Servidor.com.br, ou www.Servidor.com.br

 // monta a linha para conexão...
 Local cUserIdFtp := "ftp://"+cLogin+":"+cSenha+"@"+cServidor

 Clear Screen

 oFtp := TIpClientFtp():new( cUserIdFtp, .T. )

 If !oFtp:open()
  ? oFtp:lastErrorMessage()
  Return
 EndIf

 oFtp:exGauge := ( @FtpProgress() ) // barra de progresso

 ? oFtp:cwd("."), oFtp:cReply // se posiciona na Raiz...

 // vamos criar uma pasta chamada meuftpwin...
 // se ela existir, ignora e retorna .F., se não, cria e retorna .T.
 ? oFtp:mkd( "meuftpwin" ), oFtp:cReply

 // vamos se posicionar na pasta meuftpwin...
 ? oFtp:cwd( "meuftpwin" ), oFtp:cReply

 // vamos subir os arquivos deste exemplo...
 ?
 ? oFtp:uploadFile( "exemplo.prg" )  , oFtp:cReply
 ? oFtp:uploadFile( "exemplo.exe" )  , oFtp:cReply

 // vamos provar que os arquivos subiram...
 ?
 aFiles := oFtp:listFiles()  // lista Conteudo da Pasta corrente
 For x = 1 To Len( aFiles )
  ? aFiles[ x, 1 ]
  //oFtp:downloadFile( aFiles[ x, 1 ] )  // para download usar este laço...
 next

 ?
 // antes de sair, selecione sempre a Raiz
 ? oFtp:cwd("."), oFtp:cReply

 // encerra conexão...
 oFtp:close()

Return

// exibe o progresso do download/upload
Function FtpProgress( nSent, nLenFile, oFtp )
 Local cProgress, nRow := Row(), nCol := Col()

 If nSent = 0
  @ MaxRow()-4, (MaxCol()-40)/2 Say Space( 40 )
 Else
  cProgress := Replicate( "█", Int( 40*nSent/nLenFile ) )
  @ MaxRow()-4, (MaxCol()-40)/2 Say cProgress
 EndIf
 @ MaxRow()-2, (MaxCol()-40)/2 Say PadC( "Baixando => "+Hb_NToS(nSent)+" de "+Hb_NToS(nLenFile), 40 )
 
 SetPos( nRow, nCol )
 
Return .T.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Selecionar todos arquivos de uma pasta FTP

Mensagem por gilbertosilverio »

Ola Jairo,

Muito obrigado pela ajuda.

Consegui fazer o que precisava com sua ajuda. Agora consigo baixar todos os arquivos que estão na pasta no servidor.

Ficou assim:

Código: Selecionar todos

function DownLoad_FTP()
    LOCAL lRetVal := .T.
    LOCAL aFiles, cFile, aCP
    LOCAL oFTP, oURL, cFILESPEC, aTESTE
 
    cServer           := "192.168.1.132"
    cUser             := "Gilberto64"
    cPassword         := "senha"
    cUrl              := "ftp://" + cUser + ":" + cPassword + "@" + cServer
    oURL              := TUrl():New( cURL )
    oFTP              := TIPClientFTP():New( oURL, .T. )
    oFTP:nConnTimeout := 20000
    oFTP:bUsePasv     := .T.

     aFILES:={}

     IF oFTP:Open( cURL )

        aCp := oFtp:listFiles()  // lista Conteudo da Pasta corrente

        For i = 1 To Len( aCp )
             ? SUBSTR(aCp[i,1],40)
             aadd( Afiles, ALLTRIM(SUBSTR(aCp[i,1],40)) ) // pega o nome do arquivo 
        next

        WAIT

        FOR EACH cFile IN aFiles
             IF oFtp:DownloadFile( cFile )
                //oFtp:Dele( cFILE )
                lRetVal := .T.
           ELSE
                lRetVal := .F.
                EXIT
           ENDIF
         NEXT
         oFTP:Close()
     ELSE
        ? "Could not connect to FTP server", oURL:cServer
        IF oFTP:SocketCon == NIL
           ? "Connection not initialized"
        ELSEIF inetErrorCode( oFTP:SocketCon ) == 0
           ? "Server response:", oFTP:cReply
        ELSE
           ? "Error in connection:", inetErrorDesc( oFTP:SocketCon )
        ENDIF
        lRetVal := .F.
     ENDIF
   ENDIF
   ErrorLevel( iif( lRetVal, 0, 1 ) )
RETURN

Editado pela última vez por Toledo em 30 Out 2014 21:06, em um total de 1 vez.
Razão: Mensagem editada. Evite postar nome de usuários ou senhas pessoais.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Selecionar todos arquivos de uma pasta FTP

Mensagem por gilbertosilverio »

Ola amigos,

Como faço para acessar um FTP quando o primeiro caracter da senha e um ARROBA?

Montei todas as rotinas para envio e recebimento dos arquivos, funcionando perfeitamente, mais para a minha surpresa, a senha que o CONVENIO que preciso enviar/receber estes arquivos veio com um @, e não consigo de maneira nenhuma conectar.

Como devo proceder neste caso

cServer := "ftp.testeconvenio.com.br"
cUser := "Usuario"
cPassword := "@teste1!!"


Agradeço a ajuda.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Selecionar todos arquivos de uma pasta FTP

Mensagem por Jairo Maia »

Olá Gilberto,

Não vejo nenhum motivo para ser o @ o problema. Verifique com seu cliente o login e senha corretamente, e lembre-se que ambos são case sensitive. A senha é uma string literal, e não sofre nenhum tratamento.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Selecionar todos arquivos de uma pasta FTP

Mensagem por gilbertosilverio »

Ola Jairo,

O estranho e que pelo Filezilla eu consigo logar com a senha começando com @, mais pelo harbour não.

Fiz vários testes como meu servidor local também, e realmente pelo harbour não conecta, era so colocar o @ na senha que não logava.

Não seria algum conflito como o @ do cURL, acho que o sistema se perde aqui...

cUrl := "ftp://" + cUser + ":" + cPassword + "@" + cServer

Solução encontrada: o pessoal do convenio trocou a senha, suprimindo o @ e foi de primeira.

Novamente muito obrigado.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Selecionar todos arquivos de uma pasta FTP

Mensagem por Jairo Maia »

Olá Gilberto,

Muito interessante. Bom registro ao fórum...
gilbertosilverio escreveu:Não seria algum conflito como o @ do cURL, acho que o sistema se perde aqui...
cUrl := "ftp://" + cUser + ":" + cPassword + "@" + cServer
Realmente tem a ver isso, porque veja que nessa linha, o "@" existe para a classe saber que é a informação do servidor, assim, se ela está na senha a senha é entendida como tal.

Não consegui achar os fontes do método :New(), mas creio que não foi pensado que o "@" que informa o servidor é o último da linha. Acho que nunca imaginaram uma senha com "@". Mas enfim...
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Responder