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