Página 2 de 5

Copia com barra de progresso.

Enviado: 21 Nov 2013 01:57
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 ) }

Copia com barra de progresso.

Enviado: 21 Nov 2013 16:38
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.

Copia com barra de progresso.

Enviado: 21 Nov 2013 18:03
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

Copia com barra de progresso.

Enviado: 22 Nov 2013 00:06
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.

Copia com barra de progresso.

Enviado: 22 Nov 2013 09:12
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.

Copia com barra de progresso.

Enviado: 22 Nov 2013 20:59
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.

Copia com barra de progresso.

Enviado: 22 Nov 2013 23:51
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,

Copia com barra de progresso.

Enviado: 23 Nov 2013 00:00
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

Copia com barra de progresso.

Enviado: 23 Nov 2013 00:25
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.

Copia com barra de progresso.

Enviado: 23 Nov 2013 01:27
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,

Copia com barra de progresso.

Enviado: 23 Nov 2013 09:09
por cjp
De fato, agora funcionou. Muito obrigado.

Copia com barra de progresso.

Enviado: 23 Nov 2013 10:26
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.

Copia com barra de progresso.

Enviado: 23 Nov 2013 12:01
por Toledo
Inácio, por favor cole aqui a sua função completa, para podermos analisar o que você está fazendo.

Abraços,

Copia com barra de progresso.

Enviado: 23 Nov 2013 14:37
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
//-----------------------------------------------------------------------------------------


Copia com barra de progresso.

Enviado: 23 Nov 2013 16:15
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,