Copia com barra de progresso.
Moderador: Moderadores
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Copia com barra de progresso.
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 ) }
{ | 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/
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/
Copia com barra de progresso.
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:
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.
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
Ainda não consegui onde estaria o erro.
Inacio de Carvalho Neto
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Copia com barra de progresso.
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
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/
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/
Copia com barra de progresso.
Se eu entendi bem o que vc disse, era pra substituir este código:
por este:
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.
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
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
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
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Copia com barra de progresso.
Código: Selecionar todos
lCopy := xhb_CopyFile( ;
aFileInfo[ nItem, F_NAME ], ;
"c:\backup\", ;
{ | nBytesCopiados, nBytesTotal | MostraCopia( nBytesCopiados,nBytesTotal ) } )
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/
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/
Copia com barra de progresso.
Agora compilou. Mas está dando erro na execução:
Achei estranho, porque não estou criando a pasta backup, ela já existe.
Código: Selecionar todos
Error BASE/2012 Erro de criação: c:\backup\ (DOS Error 5) Inacio de Carvalho Neto
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Copia com barra de progresso.
origem = nome do arquivo origemJoséQuintas escreveu:A sintaxe é xhb_CopyFile( origem, destino, codeblock )
destino = nome do arquivo destino
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:cjp escreveu:Error BASE/2012 Erro de criação: c:\backup\ (DOS Error 5)
Código: Selecionar todos
lCopy := xhb_CopyFile( ;
aFileInfo[ nItem, F_NAME ], ;
"c:\backup\"+aFileInfo[ nItem, F_NAME ], ;
{ | nBytesCopiados, nBytesTotal | MostraCopia( nBytesCopiados,nBytesTotal ) } )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
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
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Copia com barra de progresso.
Só como comentário adicional, pra ajudar em problemas futuros, casos como esse pode tentar "quebrar" em pedaços:
Lembrando que falta confirmar se hb_copy vai passar somente copiados, ou se vai passar copiados e total
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 )
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/
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/
Copia com barra de progresso.
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:
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.
Código: Selecionar todos
IF ! lCopy
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 ) )
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
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Copia com barra de progresso.
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.
Como o Jairo observou, esta função pode retornar .F. ou NIL, então esta linha deve ser modificada, faça um teste com:cjp escreveu:IF ! lCopy
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.
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:JoséQuintas escreveu:Lembrando que falta confirmar se hb_copy vai passar somente copiados, ou se vai passar copiados e total
Código: Selecionar todos
lCopy := xhb_CopyFile( ;
aFileInfo[ nItem, F_NAME ], ;
"c:\backup\"+aFileInfo[ nItem, F_NAME ], ;
{ | nBytesCopiados | MostraCopia( nBytesCopiados,nTotalBytes ) } )Código: Selecionar todos
AEval( aFileInfo, { |e| nTotalBytes += e[ F_SIZE ] } )Pode deixar como estava antes, com o STR e LTRIM, as modificações acima resolve este problema.cjp escreveu:Então, não estou entendendo a razão do erro quando uso o Str.
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
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
Copia com barra de progresso.
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.
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) A minha dúvida é por que a função directory("*.*") está incluindo esse arquivo para ser copiado.
Inacio de Carvalho Neto
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Copia com barra de progresso.
Inácio, por favor cole aqui a sua função completa, para podermos analisar o que você está fazendo.
Abraços,
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
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
Copia com barra de progresso.
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
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Copia com barra de progresso.
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.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
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("*.*")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
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
