Copia com barra de progresso.

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Copia com barra de progresso.

Mensagem por JoséQuintas »

Codeblock é assim:
{ | variaveis | funcao() }

ou

{ || funcao() }

Na sua linha tem um | em lugar errado.

A sintaxe é hb_xcopy( origem, destino, codeblock )

E o codeblock de cópia só tem um parâmetro, contendo quanto foi copiado.

{ | andamento | ShowCopy( andamento ) }
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Copia com barra de progresso.

Mensagem por cjp »

Desculpe, meu caro, mas ainda não entendi.

A função foi feita pelo Alexandre, eu apenas peguei aqui. E não entendo como funciona codeblok.

A | que estaria sobrando seria a que está depois de MostraCopia( ? Tirei ela, mas continua dando o mesmo erro.

A linha do erro está assim:

Código: Selecionar todos

   lCopy := xhb_CopyFile( aFileInfo[ nItem, F_NAME ], ;
              "c:\backup\", ;
              { | aFileInfo[ nItem, F_SIZE ], nTotalBytes | MostraCopia( aFileInfo[ nItem, F_SIZE ], nTotalBytes ) } ) // Size of Every File copied
Pelo que entendi, origem seria aFileInfo[nItem, F_NAME]. Destino seria c:\backup\. E o codeblock seria o restante. No codeblock, haveria duas variáveis (aFileinfo[nItem, F_SIZE} e nTotalBytes), separadas por |, e a função seria MostraCopia(), com duas variáveis (aFileInfo[nItem, F_SIZE] e nTotalBytes. Estou certo?

Ainda não consegui onde estaria o erro.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Copia com barra de progresso.

Mensagem por JoséQuintas »

Já retirou o que tinha a mais, mas...

Demorei pra entender o codeblock também.

É como se o codeblock fosse uma função intermediária, sem nome.

FUNCTION SemNome( a, b )
RETURN Funcao( a, b )

E se escreve { | a, b | Funcao( a, b ) }

Quando for usar o codeblock, que é o que a função de cópia faz, é ela quem vai passar os parâmetros a,b.

Então vejo mais uma coisa; Os parâmetros estão errados.

Usando a descrição que fiz acima, isto não existe:

FUNCTION SemNome( aFizeInfo[ nItem, F_Size ], nTotalBytes )

uso normal:
hb_CopyFile( Origem, Destino, { | copiados, total | SeuGrafico( nCopiados, nTotal ) } )

A função hb_copyfile vai chamar o codeblock (função semnome) que por sua vez chama SeuGrafico().
Só posso dizer pra testar se ela passa 1 ou 2 parâmetros.

FUNCTION SeuGrafico( nCopiados, nTotal )
IF ValType( nTotal ) == NIL
? "hb_copyfile não tem segundo parâmetro"
ENDIF
RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Copia com barra de progresso.

Mensagem por cjp »

Se eu entendi bem o que vc disse, era pra substituir este código:

Código: Selecionar todos

lCopy := xhb_CopyFile( aFileInfo[ nItem, F_NAME ], ;
       "c:\backup\", ;
       { | aFileInfo[ nItem, F_SIZE ], nTotalBytes | MostraCopia( aFileInfo[ nItem, F_SIZE ], nTotalBytes ) } ) // Size of Every File copied
por este:

Código: Selecionar todos

   lCopy := xhb_CopyFile( aFileInfo[ nItem, F_NAME ], ;
              "c:\backup\", ;
              { | aFileInfo[ nItem, F_SIZE ], nTotalBytes | MostraCopia( nCopiados, nTotalBytes ) } ) // Size of Every File copied
Fiz isto, mas continua dando o mesmo erro de sintaxe na compilação.

Se não for isso, eu não entendi o que vc disse. Ainda não entendi bem essa questão de função sem nome.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Copia com barra de progresso.

Mensagem por JoséQuintas »

Código: Selecionar todos

lCopy := xhb_CopyFile( ;
       aFileInfo[ nItem, F_NAME ], ;
       "c:\backup\", ;
       { | nBytesCopiados, nBytesTotal | MostraCopia( nBytesCopiados,nBytesTotal ) } )
Se por acaso xhb_copy não passar dois parâmetros, vai ter que resolver nBytesTotal de outro jeito.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Copia com barra de progresso.

Mensagem por cjp »

Agora compilou. Mas está dando erro na execução:

Código: Selecionar todos

Error BASE/2012  Erro de criação: c:\backup\ (DOS Error 5) 
Achei estranho, porque não estou criando a pasta backup, ela já existe.
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Copia com barra de progresso.

Mensagem por Toledo »

JoséQuintas escreveu:A sintaxe é xhb_CopyFile( origem, destino, codeblock )
origem = nome do arquivo origem
destino = nome do arquivo destino
cjp escreveu:Error BASE/2012 Erro de criação: c:\backup\ (DOS Error 5)
Bom, se na função xhb_CopyFile você tem que passar o nome do arquivo origem e também o arquivo destino, neste caso basta fazer o seguinte:

Código: Selecionar todos

lCopy := xhb_CopyFile( ;
       aFileInfo[ nItem, F_NAME ], ;
       "c:\backup\"+aFileInfo[ nItem, F_NAME ], ;
       { | nBytesCopiados, nBytesTotal | MostraCopia( nBytesCopiados,nBytesTotal ) } )
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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Copia com barra de progresso.

Mensagem por JoséQuintas »

Só como comentário adicional, pra ajudar em problemas futuros, casos como esse pode tentar "quebrar" em pedaços:

Código: Selecionar todos

cOrigem := aFileInfo[ nItem, F_NAME ]
cDestino := "c:\backup\" + aFileInfo[ nItem, F_NAME ]
bBlock    := { | nBytesCopiados, nBytesTotal | MostraCopia( nBytesCopiados,nBytesTotal ) }
lCopy := xhb_CopyFile( cOrigem, cDestino, bBlock )
Lembrando que falta confirmar se hb_copy vai passar somente copiados, ou se vai passar copiados e total
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Copia com barra de progresso.

Mensagem por cjp »

Está quase funcionando. Mas ainda deu erro na linha:

Código: Selecionar todos

   IF ! lCopy
Eu comentei (desabilitei) essa parte, como já tinha feito na função anterior (a que consta no início deste post).

Mas agora está dando erro nos parâmetros STR na linha:

Código: Selecionar todos

 @10,10 Say ' Copiando :' + LTrim( Str( nTotalComplete ) ) + ' de ' + LTrim( Str( nTotalBytes ) )
Já verifiquei que o problema é no último Str, pois, ao tirar essa parte, funcionou. Acontece que nTotalBytes foi iniciado como numérico. Portanto, estaria correto o uso do Str.

Testei tirar o Str, daí deu erro nos parâmetros LTrim.

Daí testei tirar o Ltrim também. Deu erro nos parâmetros + (o que faz sentido, porque nTotalBytes é numérico.

Então, não estou entendendo a razão do erro quando uso o Str.
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Copia com barra de progresso.

Mensagem por Toledo »

Jairo Maia escreveu:Apenas uma observação: Esta função retorna .F. se houver falha na cópia, e NIL se a cópia foi bem sucedida.
cjp escreveu:IF ! lCopy
Como o Jairo observou, esta função pode retornar .F. ou NIL, então esta linha deve ser modificada, faça um teste com:

Código: Selecionar todos

IF VALTYPE(lCopy)=="L"
JoséQuintas escreveu:Se por acaso xhb_copy não passar dois parâmetros, vai ter que resolver nBytesTotal de outro jeito.
JoséQuintas escreveu:Lembrando que falta confirmar se hb_copy vai passar somente copiados, ou se vai passar copiados e total
O nosso amigo JoséQuintas observou por duas vezes que este erro com o nTotalBytes poderia ocorrer, então neste caso você terá que mudar um pouco o código:

Código: Selecionar todos

lCopy := xhb_CopyFile( ;
       aFileInfo[ nItem, F_NAME ], ;
       "c:\backup\"+aFileInfo[ nItem, F_NAME ], ;
       { | nBytesCopiados | MostraCopia( nBytesCopiados,nTotalBytes ) } )
ATENÇÃO: a variável nTotalBytes que está sendo usada no código acima, deve ser criada conforme a última mensagem que o Alexandre postou aqui no tópico:

Código: Selecionar todos

AEval( aFileInfo, { |e| nTotalBytes += e[ F_SIZE ] } )
cjp escreveu:Então, não estou entendendo a razão do erro quando uso o Str.
Pode deixar como estava antes, com o STR e LTRIM, as modificações acima resolve este problema.

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:

Copia com barra de progresso.

Mensagem por cjp »

De fato, agora funcionou. Muito obrigado.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Copia com barra de progresso.

Mensagem por cjp »

Mais um probleminha, por favor:

Notei agora a ocorrência do seguinte erro de execução:

Código: Selecionar todos

Erro de abertura: c:\backup\arqprint.tmp (DOS Error 2) 
Observo que o arquivo arqprint.tmp não existe na pasta backup, o que parece justificar o erro.

A minha dúvida é por que a função directory("*.*") está incluindo esse arquivo para ser copiado.
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Copia com barra de progresso.

Mensagem por Toledo »

Inácio, por favor cole aqui a sua função completa, para podermos analisar o que você está fazendo.

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:

Copia com barra de progresso.

Mensagem por cjp »

Aí vai:

Código: Selecionar todos

          nvpt=substr(dtoc(date()),1,2)+substr(dtoc(date()),4,2)+substr(dtoc(date()),7)+substr(time(),1,2)
             CopiarVarios("c:\backup\","c:\backup\"+nvpt+"\")
FUNCTION CopiarVarios(cPOrig,cPDest)
 LOCAL nCount AS Numeric
 LOCAL nTotalBytes AS Numeric := 0
 LOCAL lCopy AS Logical := .F.
 PRIVATE aFileInfo AS Array
 PRIVATE nItem AS Numeric
#include "Directry.ch"
   
 aFileInfo := DIRECTORY("*.*")
 
 AEval( aFileInfo, { |e| nTotalBytes += e[ F_SIZE ] } )
 
 nCount := Len( aFileInfo )
 
 FOR nItem := 1 TO nCount
     lCopy := xhb_CopyFile(cPOrig+aFileInfo[ nItem, F_NAME ],cPDest+aFileInfo[ nItem, F_NAME ],{ | nBytesCopiados | MostraCopia( nBytesCopiados,nTotalBytes ) } )
   
   IF VALTYPE(lCopy)=="L"
    Alert( "Falha ao copiar arquivo " + aFileInfo[ nItem, F_NAME ] )
    BREAK
   ENDIF 

 NEXT
 
RETURN lCopy

//-----------------------------------------------------------------------------------------

FUNCTION MostraCopia( nCopiados, nTotalBytes )

 STATIC nTotalComplete AS Numeric
 IF ValType( nTotalBytes ) == NIL
? "hb_copyfile não tem segundo parâmetro"
wait ""
ENDIF
 IF nTotalComplete == NIL
   nTotalComplete := 0
 ENDIF
 
 nTotalComplete += nCopiados
 @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
 @ maxrow()-1,1 Say "Copiando: " + LTrim( Str( nTotalComplete/1048576 ) ) + " de " + LTrim( Str( nTotalBytes/1048576 ) ) + " Mb; copiando arquivo: "+aFileInfo[ nItem, F_NAME ]
 inkey(.01)
 veragemuso()
RETURN NIL
//-----------------------------------------------------------------------------------------

Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Copia com barra de progresso.

Mensagem por Toledo »

cjp escreveu:Observo que o arquivo arqprint.tmp não existe na pasta backup, o que parece justificar o erro.
A minha dúvida é por que a função directory("*.*") está incluindo esse arquivo para ser copiado
Inácio, sempre que ocorrer algo que não tem lógica, a melhor coisa a fazer é analisar completamente o código, de preferência linha a linha, para ver se não tem nada de errado.

Quando olhei seu código, notei em que linha está o erro (não é bem um erro), mas que acaba passando despercebido.

Código: Selecionar todos

aFileInfo := DIRECTORY("*.*")
Na linha acima você está usando a função DIRECTORY() que cria um vetor com informações sobre todos os arquivos (*.*) do diretório corrente ou do diretório especificado.

Bom, acho que isto já deve tirar a sua dúvida por que a função DIRECTORY("*.*") está incluindo o arquivo arqprint.tmp, então é só corrigir a linha acima.

Outra coisa, as linhas 34 até 37 do seu código não é necessário.

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
Responder