Página 5 de 5

Copia com barra de progresso.

Enviado: 07 Fev 2014 01:18
por alxsts
Olá!
cjp escreveu:Minha dúvida agora é: como colocar isto no meu programa? Não basta salvar a parte do teste.prg feita em C++ no meu prg, correto? O que mais eu precisaria fazer?
Coloque no teu Prg que vai usar a rotina o trecho de código entre as diretivas #pragma BEGINDUMP e #pragma ENDDUMP.

Qual é o computador que você usa? Pelo que me lembro, o teu arquivo de testes tem 820 mega bytes. Este tempo de 3,5 a 4 minutos demorou na minha máquina para copiar o meu arquivo teste, de 5,4 giga bytes...

Copia com barra de progresso.

Enviado: 13 Fev 2014 23:36
por cjp
Meu caro,

Coloquei a rotina em C no meu prg, mas não mudou nada, ainda está durando cerca de 9 minutos para copiar um arquivo de cerca de 800 MB.

Será que eu não tenho que fazer mais nada para direcionar o xhb_copyfile() para essa tua rotina?

A máquina onde estou testando está com processador Intel de 3.2 GHz, com 8 GB de memória Ram. Está rodando Windows 7 64 bits.

Copia com barra de progresso.

Enviado: 14 Fev 2014 10:41
por Itamar M. Lins Jr.
Não vai funcionar.
Vc usar xHarbour, precisa modificar outros arquivos.
Além do mais, pra quê usar windows 64 se seu xHb está compilado p/ trabalhar em 32bits ?

Salvo engano!

Use o Harbour p/ 64Bits para poder usufruir de mais velocidade.

Saudações,
Itamar M. Lins Jr.

Copia com barra de progresso.

Enviado: 14 Fev 2014 11:08
por cjp
Eu não uso o xharbour, estou usando o Harbour 3.2.

Tem harbour p/ 64 bits?

O problema é que em algumas máquinas eu uso XP e outras o Windows 7. Acho que assim eu não poderia usar harbou p/ 64 bits, né?

Copia com barra de progresso.

Enviado: 14 Fev 2014 13:15
por alxsts
Olá!

Como você não conseguiu gerar uma nova versão do Harbour contendo a alteração feita pelo Viktor na função xhb_CopyFile(),
sugeri que você incluísse no teu programa o fonte dela, em linguagem C, entre as diretivas #pragma begindump e #pragmaenddump.

Fiz um programa de teste mostrando como fazer isso. Neste programa de teste, já que a função está dentro do próprio Prg,
alterei o nome dela de xhb_CopyFile() para __xhb_CopyFile(), para evitar conflito com a função nativa do Harbour.

Se você está usando o fonte que postei, deverá chamar a função com este novo nome.

Código: Selecionar todos

lCopy := __XHB_COPYFILE(RTrim(cSource), RTrim(cTarget), {| x | ShowCopy( x ) }) 
Acho que você está chamando a xhb_CopyFile() original do Harbour e assim tratando blocos de 8192 bytes, ao invés dos 65536 bytes
lidos por bloco na __xhb_CopyFile() que postei. Verifique.

Copia com barra de progresso.

Enviado: 14 Fev 2014 20:43
por cjp
Ah, verdade.

Agora funcionou. Reduziu o tempo de cópia do arquivo para 4min21seg.

Muito obrigado.

Copia com barra de progresso.

Enviado: 15 Fev 2014 00:28
por alxsts
Olá!

Muito bem!

Mesmo assim, achei o tempo muito alto. Nos meus testes, copiar um arquivo de 5 giga bytes demorou menos de 4 minutos em um Core I5, Windows 7 x64.

Copia com barra de progresso.

Enviado: 15 Fev 2014 00:41
por cjp
É que a tua máquina é mais potente que a minha, não?

Teria alguma coisa que eu pudesse fazer para deixar ainda mais rápido? Obviamente, sem ter que trocar de máquina.

Servidor NTP para harbour 3.0

Enviado: 19 Fev 2014 01:07
por cjp
Outro problema:

Tentando usar esta função __xhb_copyfile() em outra função minha, para cópia de vários arquivos ao mesmo tempo, que foi construída com ajuda dos colegas da lista, está dando o seguinte erro:

Imagem

Ressalto que não existe arquivo com esse nome na pasta.

Minha função está assim:

Código: Selecionar todos

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
 private cTime := 0 //"XX"
#include "Directry.ch"
   
 aFileInfo := DIRECTORY(cPOrig+"*.*")
 
 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 cTime <= seconds()-10
   RETURN NIL
 ENDIF
 IF nTotalComplete == NIL
   nTotalComplete := 0
 ENDIF
 
 nTotalComplete += nCopiados
 @ maxrow()-1,1 clear to maxrow()-1,maxcol()
 @ maxrow()-1,1 Say "Copiando: " + LTrim( Str( nTotalComplete/1048576 ) ) + " de " + LTrim( Str( nTotalBytes/1048576 ) ) + " Mb; copiando arquivo: "+aFileInfo[ nItem, F_NAME ]
 inkey(.01)
 cTime := seconds()
 veragemuso()
RETURN NIL

Copia com barra de progresso.

Enviado: 19 Fev 2014 08:32
por Toledo
cjp escreveu:Ressalto que não existe arquivo com esse nome na pasta.
Amigo, o código da sua função parece estar correto, se a mensagem de falha na copia do arquivo foi apresentada é que a função DIRECTORY() encontrou este arquivo na pasta (cPOrig) que você informou, então é bom verificar novamente se na pasta (cPOrig) não existe o arquivo.
Olha, parece que no início do nome do arquivo tem um ESPAÇO em branco, dá para perceber pela imagem que você postou na mensagem anterior, existe 2 espaços depois da palavra arquivo na mensagem de falha.

Se realmente você não encontrar o arquivo, então passe o código em que você chama a função CopiarVarios(), mostrando qual é o conteúdo da variável cPOrig. Passe também o código da função veragemuso().

Abraços,

Copia com barra de progresso.

Enviado: 19 Fev 2014 11:51
por alxsts
Olá!

Na verdade, não está acontecendo erro algum.

Explico: a função xhb_CopyFile() original retorna .T. em caso de sucesso ou NIL em caso de falha. Na versão que postei alterei isto. A __xhb_CopyFile() retorna .T. se copiou ou .F. em caso de falha.

Altere o teu código conforme abaixo:

Código: Selecionar todos

 FOR nItem := 1 TO nCount
     lCopy := __xhb_CopyFile(cPOrig+aFileInfo[ nItem, F_NAME ],cPDest+aFileInfo[ nItem, F_NAME ],{ | nBytesCopiados | MostraCopia( nBytesCopiados,nTotalBytes ) } )
   IF ! lCopy()
    Alert( "Falha ao copiar arquivo " + aFileInfo[ nItem, F_NAME ] )
    BREAK
   ENDIF 

 NEXT

Copia com barra de progresso.

Enviado: 03 Mar 2014 00:49
por cjp
Toledo, vc tinha razão: de fato o nome do arquivo estava iniciando com espaço. Isso eu até já havia percebido, mas, como não achei nenhum arquivo assim na pasta corrente, achei que não era esse o problema. Mas depois fui ver que a função copia arquivos de outra pasta, não a corrente, e nessa outra pasta havia sim o arquivo iniciando com espaço.

Obrigado a todos.