Página 3 de 3
ftp com TIPCLIENT do XHB
Enviado: 05 Set 2013 01:25
por cjp
Colegas,
Usando a sugestão do Jairo, não resolveu meu problema, porque, pelo que notei, quando dá o problema, ele fica dando o problema por bastante tempo.
Por isso, tentei contato com o provedor, para ver se eles saberiam me dar uma solução, caso o problema seja no acesso ao FTP com o provedor.
O provedor também não achou nenhum problema, e está me pedindo uma cópia do erro para análise.
O problema é que, ao que eu sei, a TIPCLIENT não informa nenhum erro. Estou certo? Tem algum jeito de eu demonstrar para o provedor que o problema deve ser deles?
Outra dúvida: vocês saberiam me informar qual é a função da TIPCLIENT equivalente ao comando mdelete do FTP do DOS, ou seja, a função que apague vários arquivos de uma vez de uma pasta do FTP? Estou tendo problemas com o mdelete, que executo dentro de um .bat, pois, aparentemente, desde que mudei de provedor, ele passou a pedir confirmação de exclusão do arquivo, o que não consigo fazer executando de um .bat.
ftp com TIPCLIENT do XHB
Enviado: 05 Set 2013 13:18
por Jairo Maia
Olá Inácio,
Seu arquivo de erro ou sucesso da conexão chama-se
ftp-<n>.log, onde n é o numero do arquivo. Ele começa como
ftp-1.log, e portanto sua última ação estará no arquivo mais recente, ou seja, com número maior. Este arquivo é criado quando você usa o segundo parâmetro como .T. no método New(), que é seu caso:
oFtp:=tipclientftp():NEW(oUrl,,.T.)
Porém, antes, fiz uma pequena alteração em seu código, para se posicionar na pasta raiz antes de selecionar sua pasta. Não sei se é isso, mas podemos tentar mais uma vez. Se ainda assim houver falha na seleção da pasta, veja que vai emitir uma mensagem sobre o motivo da falha.
Também uma dica: Use sempre caminho completo para o ftp, tipo, se sua pasta se chama meusdados, mas ela está dentro da pasta httpdocs por exemplo, então use:
pasta := "/httpdocs/meusdados", ou seja, o caminho completo. Particularmente gosto de usar o caminho completo sempre.
Mas se nada funcionar ainda, então envie o arquivo de log ao seu servidor para análise.
Código: Selecionar todos
oFtp:cwd( "" ) // tenta se posicionar na pasta raiz
if oFTP:Cwd(pasta)=.f.
Hb_Alert( oFtp:cReply ) // vai mostrar o que ocorreu...
return .f.
endif
ftp com TIPCLIENT do XHB
Enviado: 06 Set 2013 00:21
por cjp
Caro Jairo,
Não achei esse arquivo FTP*.LOG, que vc mencionou. Não está na pasta do programa, nem no resto do HD.
Eu sempre uso o caminho completo da pasta. A variável pasta já contém o caminho completo. Entretanto, diferentemente do DOS, em que dá pra comandar CD\MINHAPASTA mesmo dentro da pasta MINHAPASTA, no FTP, salvo engano da minha parte, não dá pra fazer isso. No FTP do Dos, eu testei CD/MINHAPASTA e CD\MINHAPASTA, mas ambos não funcionam. E CD MINHAPASTA só funciona se estiver na raiz.
Com o seu alerta sobre voltar para a pasta inicial, pensei se o problema não seria por ele estar iniciando a função já dentro de uma pasta específica. Isso é possível?
Meu programa chama esta função várias vezes. Supostamente, ela abre e fecha o FTP cada vez que a função é acessada. Ao abrir a primeira vez, acessa a pasta. Da segunda vez em diante, será que a pasta inicial já não estaria acessada, e daria erro ao tentar acessar a pasta de novo?
Ao colocar a tua sugestão de retornar à pasta principal, até agora não deu o erro novamente. Isso talvez seja um indicativo de que seja este o problema, né?
Reiterando minha outra dúvida: vocês saberiam me informar qual é a função da TIPCLIENT equivalente ao comando mdelete do FTP do DOS, ou seja, a função que apague vários arquivos de uma vez de uma pasta do FTP? Estou tendo problemas com o mdelete, que executo dentro de um .bat, pois, aparentemente, desde que mudei de provedor, ele passou a pedir confirmação de exclusão do arquivo, o que não consigo fazer executando de um .bat.
ftp com TIPCLIENT do XHB
Enviado: 06 Set 2013 08:21
por Jairo Maia
Olá Inácio,
cjp escreveu:Não achei esse arquivo FTP*.LOG, que vc mencionou
Só notei agora. Quando você adaptou o exemplo do colega Fladimir você cometeu um erro aqui:
oFtp:= tipclientftp():NEW(oUrl,,.T.) Veja que o .T. está como terceiro parâmetro. Corrija para que ele seja o segundo que vai ser criado o arquivo de log.
cjp escreveu:CD/MINHAPASTA e CD\MINHAPASTA, mas ambos não funcionam
Com certeza, e nuca me referi ao tal CD. Veja que quando falei em caminho completo, usei a sintaxe própria de internet, em momento nenhum usei CD. O equivalente em Dos para
CD\MinhaPasta, em ftp é
/MinhaPasta
cjp escreveu:pensei se o problema não seria por ele estar iniciando a função já dentro de uma pasta específica. Isso é possível?
Perfeitamente possível. Um raciocínio igual a você mudar de pasta em uma unidade de disco fixo diferente da atual. O último posicionamento se mantém.
cjp escreveu:Supostamente, ela abre e fecha o FTP cada vez que a função é acessada
E está correto. Apenas passaria a dica para que sempre antes de fechar a conexão, você se posicionar sempre na pasta Raiz:
Código: Selecionar todos
oFtp:cwd( "" ) // se posiciona na pasta raiz
oFtp:close() // fecha a conexão
cjp escreveu:Isso talvez seja um indicativo de que seja este o problema, né?
Pois é... Pensei várias vezes que esse poderia ser o problema e achava que poderia ser bobagem, mas agora principalmente depois de suas explicações sobre acessar várias vezes o ftp estou propenso a dizer que Sim, este era o problema.
cjp escreveu:qual é a função da TIPCLIENT equivalente ao comando mdelete do FTP do DOS
Eu não conheço esse comando, não sei como ele trabalha. Mas anexei um exemplo para você entender como proceder para excluir uma pasta com a TipClient. Pelo que entendi e vi até agora, seu servidor é Linux, então o exemplo funcionará corretamente em seu servidor.
Edit o exemplo e apenas preencha as variáveis de informações de login, e salve o exemplo com o mesmo nome que dei, ou seja
meuftp.prg, para que nenhuma alteração seja necessária para você ver como ele funciona.
ftp com TIPCLIENT do XHB
Enviado: 06 Set 2013 15:42
por cjp
Más notícias: o problema voltou a ocorrer.
Observe o conteúdo do ftp-1.log (agora apareceu):
Código: Selecionar todos
20130906-15:19:53 :INETCONNECT( ftp.inaciocarvalho.com.br, 21 )
>> <pointer> <<
20130906-15:19:53 :INETERRORCODE( <pointer> )
>> 0 <<
20130906-15:19:53 :INETRECVLINE( <pointer>, , 128 )
>> 220 Microsoft FTP Service <<
20130906-15:19:53 :INETERRORCODE( <pointer> )
>> 0 <<
20130906-15:19:53 :INETSENDALL( <pointer>, 15, USER inaciobr<cr><lf> )
>> 15 <<
20130906-15:19:53 :INETRECVLINE( <pointer>, , 128 )
>> 331 Password required for inaciobr. <<
20130906-15:19:53 :INETERRORCODE( <pointer> )
>> 0 <<
20130906-15:19:53 :INETSENDALL( <pointer>, 15, PASS minhasenha<cr><lf> )
>> 15 <<
20130906-15:19:53 :INETRECVLINE( <pointer>, , 128 )
>> 230 User inaciobr logged in. <<
20130906-15:19:53 :INETERRORCODE( <pointer> )
>> 0 <<
20130906-15:19:53 :INETSENDALL( <pointer>, 8, TYPE I<cr><lf> )
>> 8 <<
20130906-15:19:53 :INETRECVLINE( <pointer>, , 128 )
>> 200 Type set to I. <<
20130906-15:19:53 :INETERRORCODE( <pointer> )
>> 0 <<
20130906-15:19:53 :INETSENDALL( <pointer>, 6, CWD <cr><lf> )
>> 6 <<
20130906-15:19:53 :INETRECVLINE( <pointer>, , 128 )
>> 250 CWD command successful. <<
20130906-15:19:53 :INETERRORCODE( <pointer> )
>> 0 <<
20130906-15:19:53 :INETSENDALL( <pointer>, 15, CWD aaaaaaaaa<cr><lf> )
>> 15 <<
20130906-15:19:53 :INETRECVLINE( <pointer>, , 128 )
>> 550 aaaaaaaaa: The system cannot find the file specified. <<
20130906-15:19:53 :INETERRORCODE( <pointer> )
>> 0 <<
Neste caso, eu coloquei uma pasta propositalmente inexistente, para testar. Mas está dando o problema também com pasta existente, às vezes.
Estranhei o fato de o erro ser "cannot find the file". Não seria pasta?
Entendi o que vc falou do CD/minhapasta. Mas o que eu quis dizer é que com /minhapasta não funciona.
O teu exemplo está dando o seguinte erro ao compilar: "undefined reference to 'HB_FUN_TIPCLIENTFTP'". Será que falta algum include? Ou eu fiz algo errado?
Notei nele que tem a função oFTP:rmd() que apaga a pasta inteira. O que eu queria era apagar o conteúdo da pasta, mas deixando a pasta.
ftp com TIPCLIENT do XHB
Enviado: 06 Set 2013 16:55
por Jairo Maia
Olá Inácio,
cjp escreveu:Observe o conteúdo do ftp-1.log [...] Neste caso, eu coloquei uma pasta propositalmente inexistente, para testar
Ok. Como foi uma simulação o log está correto, não achou a pasta inexistente.
cjp escreveu:Estranhei o fato de o erro ser "cannot find the file". Não seria pasta?
Diferente do que pensei, seu servidor é Windows, e não Linux. Sem problema, apenas acho que o exemplo abaixo não vai funcionar as funções de apagar os arquivos e pastas. De qualquer forma, faça o teste. Se seu servidor fosse Linux seria:
Can't change directory to aaaaaaaaa: No such file or directory.
cjp escreveu: Mas está dando o problema também com pasta existente, às vezes.
Mas agora é você lapidar seu código, inclusive ajustando para gerar o log e verificar porque não alterou. Certifique-se de voltar a raiz sempre que for usar o método :cwd( pasta )
cjp escreveu:O teu exemplo está dando o seguinte erro ao compilar: "undefined reference to 'HB_FUN_TIPCLIENTFTP'"
No cabeçalho do exemplo onde escrevi:
Hbmk2 meuftp.prg -lhbct, leia:
Hbmk2 meuftp.prg -lhbtip. A TipClientFtp() é uma classe da
hbtip e não
hbct como coloquei. Errei!
Mas como seu servidor é Windows, acho que não vai remover nem arquivos nem pastas, mas tente. Assim que puder monto para Windows, e quanto a apagar somente os arquivos, basta não usar o método :rmd( pasta )
ftp com TIPCLIENT do XHB
Enviado: 06 Set 2013 17:37
por cjp
Ok, agora teu exemplo rodou. Mas dá erro nas referências a /meuftp. Eu tirei a barra e funcionou. Só que a rmd não funciona porque a pasta não está vazia (acho que primeiro precisaria apagar os arquivos de dentro dessa pasta, para depois remover a pasta).
De toda forma, eu entendi bem a tua função. Só está me faltando mesmo o comando ou função que apaga todos os arquivos de uma pasta.
Agora, quanto ao problema da minha função, estou num impasse: ainda não consegui descobrir onde está o erro. Se estou fazendo cwd("") antes, supostamente estaria na raiz ao começar, e não teria razão para dar erro no cwd("minhapasta"). E o log não diz a causa do erro, só diz que a pasta não foi achada, mas a pasta existe.
Como resolver isso?
ftp com TIPCLIENT do XHB
Enviado: 07 Set 2013 12:34
por Jairo Maia
Olá Inácio,
cjp escreveu:a rmd não funciona porque a pasta não está vazia
Sim. A pasta só será apagada se estiver vazia.
cjp escreveu:Só está me faltando mesmo o comando ou função que apaga todos os arquivos de uma pasta
Na TipClientFtp acho que não tem. Você precisa montar uma função que esvazia a pasta e depois apaga. Veja no exemplo anexo uma situação assim, e tente ajustar.
cjp escreveu:ainda não consegui descobrir onde está o erro. Se estou fazendo cwd("") antes, supostamente estaria na raiz
Sim. Se você usa :cwd( "" ) você estará posicionado na pasta raiz. O que você pode fazer para descobrir é colocador na condicional que checa a falha qual é a pasta corrente, por exemplo:
Código: Selecionar todos
if oFTP:Cwd(pasta)=.f.
oFtp:pwd() // joga pasta corrente na cReply
Hb_Alert( "Pasta Corrente:;" + oFtp:cReply ) // mostra a pasta corrente
return .f.
endif
ATENÇÃO: Não coloque seu sistema com o Log ativado em produção, ou seja, não envie a seu cliente com o Log ativado. Ele declara seu
Servidor, Login e Senha. Cuidado, não esqueça.
ftp com TIPCLIENT do XHB
Enviado: 07 Set 2013 20:59
por JoséQuintas
Tenho hospedagem na kinghost, e o pessoal de suporte me passou uma coisa que eu não sabia.
Existe uma lista de IPs que por padrão são bloqueados, só vai permitir conectar se eu liberar lá na configuração do meu ftp.
O IP do meu cliente é dinâmico, e nesse dia estava falhando pra baixar o arquivo.
Ao incluir o IP na lista de aceitos, tudo voltou ao normal.
Tem mais essa variante a considerar, muito esquisita, mas já comprovei que existe.
ftp com TIPCLIENT do XHB
Enviado: 11 Set 2013 00:51
por cjp
Parece que consegui resolver o problema: com a ajuda dos códigos de erro, constatei que a variável pasta estava com espaço ao final. Depois que coloquei pasta=alltrim(pasta), não deu mais problema (ao menos até agora). O estranho é que, antes de eu mudar de servidor, não dava problema o espaço ao final.
De toda sorte, obrigado a todos que ajudaram.
Mas fiquei com uma dúvida quando você disse:
Não coloque seu sistema com o Log ativado em produção, ou seja, não envie a seu cliente com o Log ativado. Ele declara seu Servidor, Login e Senha. Cuidado, não esqueça.
Você quer dizer que não é pra colocar os dados de acesso do FTP no programa? E como eu faria então? Mas o usuário do programa tem como acessar esses dados (partindo, obviamente, do pressuposto que são usuários simples, sem grandes conhecimentos de programação)?
ftp com TIPCLIENT do XHB
Enviado: 11 Set 2013 08:06
por Jairo Maia
Olá Inácio,
cjp escreveu:Você quer dizer que não é pra colocar os dados de acesso do FTP no programa?
Não. Eu quis dizer pra você usar o parâmetro .T. que cria o log apenas para solucionar problemas. Depois que tudo está está correto, não use assim:
oFtp:= tipclientftp():NEW(oUrl,.T.). Retire o
.T..Acho mais prudente.
cjp escreveu:O estranho é que, antes de eu mudar de servidor, não dava problema o espaço ao final.
Pois é. Por exemplo, no seu servidor se você coloca /pasta também não dá certo, enquanto no meu navego usando a barra para passar de uma pasta a outra sem problema, tanto no Unix como Windows.
Nunca enfrentei também problema similar ao que o José relatou, mas já vi aqui no fórum colegas que não conseguem usar um provedor de email de forma nenhuma com a mesma rotina que outros colegas usam (incluindo a mim) sem problemas para envio de emails. Enfim..., acho que depende muito da configuração de cada provedor.
ftp com TIPCLIENT do XHB
Enviado: 11 Set 2013 17:19
por cjp
Pelo que eu havia entendido, o .T. seria apenas para habilitar o log da resposta, criando o arquivo com o erro, estou certo? Mas isso não aparece para o usuário, não estou certo?
De fato, há alguns mistérios inexplicáveis.
De toda forma, muito obrigado pela ajuda.