Página 1 de 2

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 08 Set 2022 22:14
por Linguagemclipper
Meu programa funciona direito no xHarbour, mas se compilar no Harbour algumas datas saem em branco.
O problema está no oFTP:listFiles() sendo objeto do TIpClientFtp().
Já descobriram esse bug desde 2016: https://github.com/harbour/core/issues/134
This small example shows what happens
when the argument to hb_stod() is incomplete:

? dtos( hb_stod( '2016126' ) )

So the bug is in the day not being padl()ed to 2 digits before building
the date string.
Acontece que mandaram o cara usar um tal de hbcurl até que resolvam esse bug... até hoje nada?
Poxa, dizem que hoje em dia o Harbour é tão melhor do que o xHarbour, mas eu estou tendo um monte de surpresas aí.

1 x 0 pro xHarbour.

Como eu faria para obter uma listagem do diretório de uma pasta remota com esse hbcurl?

Meu código:

Código: Selecionar todos

	MSGRODA("Abrindo conexão...", "W+/BG")
	oFTP := TIpClientFtp():new( oURL ) // ABRE CONEXÃO FTP    	
	
	IF oFTP:OPEN()							
		// CONEXÃO FTP ABERTA
		// ENTRA NA PASTA REMOTA
		MSGRODA("Acessando pasta remota no servidor...", "W+/BG")
		oFTP:CWD(cFTPFOLDER) // ENTRA NA PASTA

		// LISTA ARQUIVOS DA NUVEM
		aBAKS := oFTP:listFiles()	
		ASORT( aBAKS,,,{|X,Y| X[3] > Y[3]}) // MAIS NOVOS PRIMEIRO
		
		IF LEN(aBAKS) = 2 // SÓ . E ..
			ALERT("NUNCA FOI REALIZADO NENHUM BACKUP EM NOSSO SERVIDOR REMOTO")
			RETURN
		ENDIF
		
		// REMOVE . E .. DA LISTAGEM DO DIRETÓRIO
		#IFDEF __XHARBOUR
			// XHARBOUR APAGA E ENCOLHE
			X := ASCAN(aBAKS, {|A| UPPER(A[1]) == "."})
			ADEL(aBAKS, X, .T.)
			X := ASCAN(aBAKS, {|A| UPPER(A[1]) == ".."})
			ADEL(aBAKS, X, .T.)
		#ENDIF
		#IFDEF __HARBOUR__
			// HARBOUR APAGA, MAS NÃO ENCOLHE.
			X := ASCAN(aBAKS, {|A| UPPER(A[1]) == "."})
			ADEL(aBAKS, X)
			aBAKS := aSIZE(aBAKS, LEN(aBAKS)-1) // ENCOLHE ARRAY
			X := ASCAN(aBAKS, {|A| UPPER(A[1]) == ".."})
			ADEL(aBAKS, X)
			aBAKS := aSIZE(aBAKS, LEN(aBAKS)-1) // ENCOLHE ARRAY
		#ENDIF
		
		aCHOICES := {}
		FOR X=1 TO LEN(aBAKS)
			cFNAME := PADL(aBAKS[X][1], 15)
			cFSIZE := STR( aBAKS[X][2]/1024, 10, 0) // EM Kb
			// CFSIZE := Transform( cFSIZE, "99.999.999" )
			cFDATE := aBAKS[X][3]
			cFTIME := aBAKS[X][4]			
			// Converter fuso horário UTC 0 para -3
		   nSECS := SECS( cFTIME )
		   nUTC3 := (3*3600)   //  3h
		   nSECS -= nUTC3      // -3h 
		   IF nSECS >= 0
				cFTIME := TSTRING( nSECS )       // TRANSFORMA EM HORA C/ UTC -3
		   ELSE
				// MADRUGADA DO DIA ANTERIOR, VOLTA 1 DIA
				cFDATE -= 1                         // VOLTA 1 DIA
				nSECS  := SECS( 86400 + nSECS )     // TRANSFORMA EM HORA
				cFTIME := TSTRING( nSECS )          // ATUALIZA HORA C/ FUSO UTC -3
		   ENDIF
			cFDATE := DTOC(cFDATE)
			AADD(aCHOICES, cFNAME +"│"+cFSIZE +"│"+ cFDATE +"│"+ cFTIME )
		NEXT
		MSGRODA("Escolha o backup que deseja restaurar", "W+/BG")
		TRJANELA(04,09,11,54,"W/B", "BACKUPS REMOTOS EXISTENTES", .T.)
		@ 05,10 SAY SPACE(44) COLOR "W/BG"
		@ 05,10 SAY "    NOME       │TAMANHO Kb│  DATA  │ HORA " COLOR "W+/BG"
		nBAK := ACHOICE(06,10,10,53, aCHOICES)

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 00:08
por alxsts
Olá!
Quanto a encolher arrays, use hb_ADel( aArray, nPos, lShrink ). O terceiro param .T. exclui o último elemento.

Quanto à listagem de diretório FTP, ainda não testei. Está usando a versão atualizada do Harbour?

Bug TIPCLIENTFTP

Enviado: 09 Set 2022 09:45
por Linguagemclipper
Olá pessoal, me desculpem, o erro não está aí. Eu quem colocou a senha errada mesmo, minha senha dessa rotina contém uma palavra acrescida do dia e mês, como não mostrou a data do arquivo aí eu acabei digitando errado.
A bronca é no TIpClientFtp() na listagem do diretório com oFTP:listFiles(). Parece que é um furo do Harbour mesmo.

Abrí outro tópico sobre esse problema do TIPCLIENTFTP:
https://pctoledo.org/forum/viewto ... =4&t=26551

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 09:47
por Linguagemclipper
Boa! Não sabia desse HB_DEL() vou substituir. Talvez deixe tudo na versão Clipper que roda com um ou com outro. Essas funções vão fazer a mesma coisa mesmo... HB_DEL() não sei se o xHarbour vai entender.
Estou usando a versão 3.2 do Harbour.

Bug TIPCLIENTFTP

Enviado: 09 Set 2022 10:02
por Itamar M. Lins Jr.
Olá!
Não é furo do Harbour.
É da classe TIP.
Tem vários BUGS e foi abandonada pelo Viktor, que adotou a CURL.

Seu xHarbour aceita hb_stod( '2016126' ) com 7 digitos ? Pq o Harbour até onde sei nunca aceitou.
Se a classe tipclient está corrigida no xHarbour, eles não colocaram no Changelog a correção.
E o Viktor respondeu sua pergunta lá, rsrsr acho que a resposta está pior de entender, fazer, enfim, mais fácil é corrigir a classe tipclient.

Não existe tanta diferença assim do xHarbour para o Harbour. Basta usar a mesma parte da tipclient do xHB caso exista correção e não seja bug da hb_stod() do xHb.

Saudações,
Itamar M. Lins Jr.

Bug TIPCLIENTFTP

Enviado: 09 Set 2022 10:35
por Linguagemclipper
Rapaz, esse teste aí não fiz, mas estou usando o xHarbour v1.2.1 e deu tudo certo, funciona normal. Era só pegar emprestado do xHarbour, correto? Até agora não ví nenhum erro nessa classe do xHarbour.

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 10:36
por Itamar M. Lins Jr.
Olá!
Já achei a diferença.
Corrigiram e não colocaram no Changelog.
Do xHarbour -> arquivo ftpclient,prg linha 883 cDay := PadL( Val( cDay ), 2, "0" )
Do Harbour -> arquivo ftpclient.prg linha não tem :-(

Saudações,
Itamar M. Lins Jr.

Bug TIPCLIENTFTP

Enviado: 09 Set 2022 10:45
por Itamar M. Lins Jr.
Olá!
Achei o BUG, já mandei para eles a diferença, agora é aguardar a correção no GIT.
Mas pode fazer ai no código seu da HBTIP que vai funcionar.

Saudações,
Itamar M. Lins Jr.

Bug TIPCLIENTFTP

Enviado: 09 Set 2022 10:52
por Linguagemclipper
Que legal!
Acabei de responder ao Viktor lá no Git, ele me mandou um exemplo em linguagem C, poxa. Sei não como faz essa integração...
Precisaria de um exemplo de como listar um diretório FTP em xbase com o tal Curl.
Enfim, não entendí como eu faria com HBTIP q vc disse pra eu fazer que ia dar certo... hehehe. Preciso de mais ajuda.

(Acha melhor realocar esses últimos posts no tópico https://pctoledo.org/forum/viewto ... =4&t=26551, não?)

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 11:50
por JoséQuintas
Se não me engano, quem criou hbtip foi o Culik do XHarbour, se ele não atualiza mais, paciência.

Quando precisei disso, criei rotina própria, depois foi ajustado no 3.4, mas não no 3.2.
Não sei em que pé está agora.

Código: Selecionar todos

CREATE CLASS MyTIPClientFTP INHERIT TIPClientFTP

   METHOD ListFiles( cFileSpec )

   ENDCLASS

METHOD ListFiles( cFileSpec ) CLASS MyTIPCLientFTP

   LOCAL aList, aFile, cEntry, aListFiles := {}
   LOCAL cYear, cMonth, cDay, cTime, cName, cSize, cAttrib, cList, nCont

   cList := ::list( cFileSpec )

   IF Empty( cList )
      RETURN aListFiles
   ENDIF

   aList := hb_ATokens( StrTran( cList, Chr( 13 ) ), Chr( 10 ) )

   FOR nCont = 1 TO Len( aList )
      cEntry := aList[ nCont ]    // 05-03-13  06:18PM              2115072 jpa.exe

      IF ! Empty( cEntry )
         aFile  := Array( 5 )
         cEntry := AllTrim( cEntry )

         cDay   := Substr( cEntry, 1, 2 )
         cMonth := Substr( cEntry, 4, 2 )
         cYear  := "20" + Substr( cEntry, 7, 2 )
         cEntry := AllTrim( Substr( cEntry, At( " ", cEntry ) ) )

         cTime := AllTrim( Substr( cEntry, 1, At( " ", cEntry ) ) )
         cEntry := AllTrim( Substr( cEntry, At( " ", cEntry ) ) )

         cSize  := AllTrim( Substr( cEntry, 1, At( " ", cEntry ) ) )
         cEntry := AllTrim( Substr( cEntry, At( " ", cEntry ) ) )

         cName := cEntry

         cAttrib := ""

         aFile[ F_NAME ] := cName
         aFile[ F_SIZE ] := Val( cSize )
         aFile[ F_ATTR ] := cAttrib
         aFile[ F_DATE ] := hb_SToD( cYear + cMonth + cDay )
         aFile[ F_TIME ] := cTime

         Aadd( aListFiles, aFile )

      ENDIF

   NEXT

   RETURN aListFiles
Lógico, foi pra meu uso específico.
A data pode estar em formato portugues, inglês, etc.

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 12:07
por JoséQuintas
No 3.4:

Código: Selecionar todos

/* Listing formats (from libcurl)
   https://github.com/curl/curl/blob/master/lib/ftplistparser.c
   Unix version 1: drwxr-xr-x 1 user01 ftp  512 Jan 29 23:32 prog
   Unix version 2: drwxr-xr-x 1 user01 ftp  512 Jan 29 1997  prog
   Unix version 3: drwxr-xr-x 1      1   1  512 Jan 29 23:32 prog
   Unix symlink  : lrwxr-xr-x 1 user01 ftp  512 Jan 29 23:32 prog -> prog2000
   DOS style/IIS : 01-29-97 11:32PM <DIR> prog
   DOS style/IIS : 01-29-97 11:32PM    512 prog
   DOS style/IIS : 01-29-2010 11:32PM <DIR> prog
 */

// Parse the :list() string into a hb_vfDirectory() compatible 2-dim array
METHOD ListFiles( cFileSpec ) CLASS TIPClientFTP
Se testaram depois do dia 9, com certeza tudo deu certo, e não viram que antes do dia 10 dá erro.

Quem comprovar algum problema é só mandar a correção.

de

Código: Selecionar todos

            aFile[ F_DATE ] := hb_SToD( cYear + cMonth + cDay )
para

Código: Selecionar todos

aFile[ F_DATE ] := hb_Stod( StrZero( Val( cYear ), 4 ) + StrZero( Val( cMonth ), 2 ) + StrZero( Val( cDay ), 2 ) )
Não vou mandar, porque não sei se precisa, além do que, o Harbour 3.4 parou.

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 12:21
por JoséQuintas
Linguagemclipper escreveu:Acabei de responder ao Viktor lá no Git, ele me mandou um exemplo em linguagem C, poxa. Sei não como faz essa integração...
Precisaria de um exemplo de como listar um diretório FTP em xbase com o tal Curl.
Enfim, não entendí como eu faria com HBTIP q vc disse pra eu fazer que ia dar certo... hehehe. Preciso de mais ajuda.
Agora tem o caminho, é só confirmar.
NÃO uso Harbour 3.2, não tenho porque baixar e olhar os fontes dele.
É com você.

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 12:24
por Linguagemclipper
Quintas, no xHarbour está ok.
Harbour 3.2 não está ok.

O que fazer? Baixar os fontes do HB32, corrigir e recompilar dos fontes? Não teria como consertar só essa lib? Aliás, qual seria essa lib?
O meu HB32 já tem todas as LIBs da vida que eu poderia usar... se for baixar os fontes ou usar o 3.4 já não sei qual ia ser a guerra.

Pelo visto a minha saída mais fácil e rápida seria usar o tal hbcurl, mas não tenho nenhum exemplo em Harbour para listar um diretório FTP com ele...

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 13:09
por Itamar M. Lins Jr.
Olá!
Pelo visto a minha saída mais fácil e rápida seria
Não, vc pode compilar a HBTIP do Harbour.
Já postei onde é a linha para acrescentar. Em menos de 1 minuto vc faz isso.
A TIP no xHarbour fica em source\tip
No Harbour fica na pastas \contrib\hbtip

Mas com certeza vão fazer o fix, pois tem alguns usuários que usa a HBTIP, eu mesmo sou um deles.

Saudações,
Itamar M. Lins Jr.

Erro na listagem de arquivos com TIpClientFtp()

Enviado: 09 Set 2022 13:47
por JoséQuintas
Linguagemclipper escreveu:Quintas, no xHarbour está ok.
Harbour 3.2 não está ok.
O que fazer? Baixar os fontes do HB32, corrigir e recompilar dos fontes? Não teria como consertar só essa lib? Aliás, qual seria essa lib?
O meu HB32 já tem todas as LIBs da vida que eu poderia usar... se for baixar os fontes ou usar o 3.4 já não sei qual ia ser a guerra.
Pelo visto a minha saída mais fácil e rápida seria usar o tal hbcurl, mas não tenho nenhum exemplo em Harbour para listar um diretório FTP com ele...
Atenção, porque é complicado:

hbtip fica na pasta contrib/hbtip

Pra compilar, é hbmk2 hbtip.hbp
mas pode ser hbmk2 *.hbp

VOCÊ está com problema, VOCÊ precisa solução.
Ou você faz, ou esquece.

XHarbour mais novo.... deu problema.
Harbour.... deu problema.
Sei lá... dá pra imaginar que talvez os fontes precisem atualização, já que dá problema com tudo que tem novo.
Ou repensar se realmente precisa essas funções a mais, porque se ninguém mais usa e ninguém mais teve problema, talvez não seja pra usar.

Pra que raios quer data/hora do FTP?
Não pode colocar num banco MySQL, pegar por acesso direto ou por webservice?

Antigamente eu gravava um TXT no FTP contendo dados dos arquivos.
Atualmente gravo no MySQL, é muito mais seguro fazer desse jeito.

Cansei de ver site retornando informação errada, por causa de caches locais, do servidor, e até do GOOGLE CHROME.
É, ISSO MESMO, GOOGLE CHROME.
Com google chrome instalado, a informação do site vinha desatualizada, porque uma das coisas do Chrome era mudar a configuração do Windows, pra ganhar tempo sem baixar do site.

E se tudo der certo, ainda pode ter o problema do fuso horário....

E aí?
Vai realmente ficar preocupado com data/hora retornada?

Acho que tá perdendo tempo com coisa que não vale a pena perder tempo.