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:
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:
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:
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:
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.
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,