Página 2 de 2

HB_ZIPFILE e HB_UNZIPFILE

Enviado: 02 Jun 2023 20:35
por JoséQuintas
Apaguei o vídeo anterior.
Do meu jeito ficou mais simples (?) e mais legal.

https://www.youtube.com/watch?v=H_NsqFpH6BM



Não ficou mais lento não.
Se olharem o fonte, cada vez que rodo o teste pega a pasta inteira e cria um zip.
Significa que a cada teste tem a pasta + o ZIP novo, o dobro de antes.

Código: Selecionar todos

#include "inkey.ch"
#include "hbclass.ch"
#include "directry.ch"

PROCEDURE Main

   LOCAL cFile, aList := {}, aFiles, bOutro, nTotal := 0, nAcumulado := 0, aFile

   aFiles := Directory( "*.*" )
   cFile := "copia_" + Dtos( Date() ) + SoNumeros( Time() ) + ".zip"
   AEval( aFiles, { | e | AAdd( aList, e[ F_NAME ] ), nTotal += e[ F_SIZE ] } )
   bOutro := { | a, b | MostraOutro(a,b,nAcumulado,nTotal ) }

   SetMode(33,100)
   SetColor( "W/B" )
   CLS
   Inkey(0)
   GrafTempo3( "arquivo" )
   GrafTempo( "total" )
   FOR EACH aFile IN aFiles
      GrafTempo2( "atual" )
      Hb_ZIPFILE( cFile ,; // Carpeta destino de la copia de seguridad
               aFile[F_NAME],; // Fichero o array a realizar el backup
               Nil         ,; // Prioridad maxima 9
               Nil         ,; // CodeBlog para refrescar oMeter y sistema
               .T.         ,; // Sobreescribir el fichero
               Nil         ,; // Password para encritar
               Nil         ,; // Guardar el path
               Nil         ,; // Guardar la unidad
               bOutro ) // CodeBlock para progreso de archivos
      GrafTempo3( aFile:__EnumIndex, Len( aFiles ) )
      nAcumulado += aFiles[ aFile:__EnumIndex, F_SIZE ]
   NEXT
   Inkey(0)

   RETURN

FUNCTION MostraOutro( a, b, nAcumulado, nTotal )
   GrafTempo2( a, b )
   GrafTempo( a + nAcumulado, nTotal )
   RETURN Nil
Graças às anotações nos fontes do Kapiaba.
Lá ele não usa o do processamento do zip, só o de quantidade de arquivos.
Se não fossem as anotações.....

HB_ZIPFILE e HB_UNZIPFILE

Enviado: 02 Jun 2023 20:48
por JoséQuintas
Descobri porque não funcionou o primeiro modo

https://harbour.github.io/doc/hbziparc.html#hb_zipfile

Os parâmetros do primeiro codeblock não são atual e total, são nome do arquivo e posição atual

Código: Selecionar todos

#include "inkey.ch"
#include "hbclass.ch"
#include "directry.ch"

PROCEDURE Main

   LOCAL cFile, aList := {}, aFiles, bUm, bOutro, nTotal := 0, nAcumulado := 0

   aFiles := Directory( "*.*" )
   AEval( aFiles, { | e | AAdd( aList, e[ F_NAME ] ), nTotal += e[ F_SIZE ] } )
   cFile := "copia_" + Dtos( Date() ) + SoNumeros( Time() ) + ".zip"
   bUm := { | a, b | Mostraum(a,b,@aFiles,@nAcumulado) }
   bOutro := { | a, b | MostraOutro(a,b,nAcumulado,nTotal ) }

   SetMode(33,100)
   SetColor( "W/B" )
   CLS
   Inkey(0)
   GrafTempo( "total" )
   GrafTempo2( "atual" )
   GrafTempo3( "arquivo" )
   Hb_ZIPFILE( cFile ,; // Carpeta destino de la copia de seguridad
               aList ,; // Fichero o array a realizar el backup
               Nil         ,; // Prioridad maxima 9
               bUm         ,; // CodeBlog para refrescar oMeter y sistema
               .T.         ,; // Sobreescribir el fichero
               Nil         ,; // Password para encritar
               Nil         ,; // Guardar el path
               Nil         ,; // Guardar la unidad
               bOutro ) // CodeBlock para progreso de archivos
   Inkey(0)

   RETURN

FUNCTION MostraUm( a, b, aFiles, nAcumulado )
   (a)
   IF b > 1
      nAcumulado += aFiles[b-1,F_SIZE]
   ENDIF
   GrafTempo3( b, Len( aFiles ) )
   RETURN Nil

FUNCTION MostraOutro( a, b, nAcumulado, nTotal )
   GrafTempo2( a, b )
   GrafTempo( a + nAcumulado, nTotal )
   RETURN Nil

Agora é só escolher qual dos 3 gráficos usar, ou usar os 3 de uma vez.
E pode fazer um arquivo de cada vez, ou passar a lista inteira de uma vez.

No meu ainda vai complicar, porque pode ter DBF e SQL....

HB_ZIPFILE e HB_UNZIPFILE

Enviado: 03 Jun 2023 02:15
por JoséQuintas
A explicação:

pro gráfico, precisa atual e total (poderia ser percentual, mas prefiro assim).
Com base nisso, dá pra montar a área máxima, e calcular o quanto vai representar o gráfico.
Exemplo simples, supondo que é coluna 0 até coluna máxima:

Código: Selecionar todos

SET COLOR TO W/B
@ 0, 0 SAY Replicate(".",MaxCol())
SET COLOR TO W/R
@ 0, 0 SAY Pad( Replicate(".",  Int( MaxCol() * nAtual / nTotal ) )
Só isso.
O gráfico tem uma cor, e a barra de progresso tem outra.
A parte vermelha vai aumentando, até que no máximo é total.
Supondo gráfico de 1 a 100, e tela 100 colunas
no 1.... MaxCol() * 1 / 100 = 1 coluna, ou 1%
no 50... MaxCol() + 50 / 100 = 50 colunas, ou 50%, ou metade
no 100... MaxCol() * 100 / 100 = 100 colunas, ou 100%, ou total

Nos codeblocks do harbour:

No primeiro codeblock vém nome e posição, com relação à quantidade de arquivos no array.
Pro gráfico precisa essa posição e a quantidade total, que seria o tamanho do array, Len( aList )
Isso resolve o gráfico 1, por quantidade de arquivos

No segundo codeblock vém posição e total, exatamente o que precisa pro gráfico
Isso resolve o gráfico 2, por tamanho do arquivo atual

Pro terceiro gráfico precisa o total, e a posição atual, com relação ao tamanho de tudo.
pro total, simples, só somar o tamanho de tudo antes de começar.
pro atual, pra evitar erros de arredondamento, soma os que já foram, e acrescenta a posição do arquivo atual.
Faço isso no primeiro codeblock, ao iniciar o arquivo atual, somo o tamanho do anterior no acumulado.
No segundo codeblock basta passar a soma desse acumulado + a posição atual, e usar o total que já foi calculado.
É isso que o gráfico 3 precisa.

E se fosse a progressbar do Windows, mesma coisa, a progressbar do Windows só precisa posição atual e total.

E por último, também importante, atualizo o gráfico a cada 1 segundo, pra que ele não atrapalhar tempo de processamento.
Faço isso comparando Time() atual com o anterior, se mudou, significa que passou 1 segundo.
Fazer comparação não é demorado, atualizar gráfico sim, então isso evita perder velocidade.

A previsão de tempo.....
Só calcular, quase igual ao gráfico.
Supondo que demorou 50 segundos até a posição atual, 50 / posição atual * ( posição final - posicao atual )

Tudo fórmula simples.
Ou... aquela velha história: dividir um problemão em probleminhas, e resolver um probleminha de cada vez.

HB_ZIPFILE e HB_UNZIPFILE

Enviado: 03 Jun 2023 11:48
por alxsts
Olá!
JoséQuintas escreveu:1 SET COLOR TO W/B
2 @ 0, 0 SAY Replicate(".",MaxCol())
3 SET COLOR TO W/R
4 @ 0, 0 SAY Pad( Replicate(".",  Int( MaxCol() * nAtual / nTotal ) )
5  
Simplificando:

Código: Selecionar todos

hb_DispOutAt( 0, 0, Replicate(".",MaxCol()), "W/B" )
hb_DispOutAt( 0, 0, Pad( Replicate(".",  Int( MaxCol() * nAtual / nTotal ) ), "W/R" )

HB_ZIPFILE e HB_UNZIPFILE

Enviado: 03 Jun 2023 17:44
por JoséQuintas
E não simplificando, caso sejam mostrados os dois ao mesmo tempo, e já em function:

Código: Selecionar todos

FUNCTION Grafico( nAtual, nTotal )

   DispBegin()
   @ 0, 0 SAY Replicate(".",MaxCol()) COLOR W/B
   @ 0, 0 SAY Pad( Replicate(".",  Int( MaxCol() * nAtual / nTotal ) ) COLOR W/R
   DispEnd()

   RETURN Nil
Comentários:
Barra de progresso com apenas duas linhas.
Poderia ser a primeira no início, e a outra durante o processamento.
E dá pra mexer no "enfeite" do gráfico, talvez até guardando o conteúdo em uma variável, caso seja enfeite muito trabalhado.

HB_ZIPFILE e HB_UNZIPFILE

Enviado: 13 Jun 2023 04:41
por Jairo Maia
Olá Pessoal. Quando postei a mensagem, eu estava com sintomas iniciais de gripe, que se agravou "um pouco depois". Como era também semana de aniversário, decidi me afastar e me desligar de "tudo" por uma semana, coisa que eu já queria fazer antes para dar uma recarregada no "cérebro" (o médico diz que eu tenho)... :))

Obrigado pessoal pelas dicas e dedicação em tentar ajudar. Agradeço a todos, mas realmente eu queria somente reescrever minhas rotinas de backup que embora todas fossem funcionais, foram escritas há vários anos, no início da migração de Clipper para Harbour, assim, apenas "enxuguei" , encurtei e atualizei os códigos.

Também troquei HB_ZipFileByTDSpan() por hb_ZipFile(), que é um pouco mais rápida e principalmente, constatei que a taxa de compressão é em torno de 20% maior que a anterior.
alxsts escreveu:Este código foi originalmente fornecido no lançamento do Clipper 5. Está na pasta Clipper\Source\Sample de uma instalação típica daquele compilador. Seguem os fontes extraídos do original:
Obrigado Alexandre Santos, era isso mesmo que eu precisava. Ajustei na minhas rotinas e ficou bom (como na figura), era o que eu queria.
Kapiaba escreveu:PBACKUP COMPLETO EM FIVEWIN
Obrigado João, mas eu não estava procurando nenhum utilitário para compressão, embora seu utilitário ficou bem legal.
JoséQuintas escreveu:Caso não encontre outra opção, uma possibilidade é acrescentar um arquivo de cada vez.
José, no manual online do Harbour, (Harbour Online Help), no menu a esquerda, dê uma olhada na opção "hbziparch" (não na opção "hbmzip"). No Harbour tem as funções: ZipCreateArray() e UnzipCreateArray().
TelaPdv.jpg

HB_ZIPFILE e HB_UNZIPFILE

Enviado: 14 Jun 2023 00:31
por alxsts
Olá!
Jairo Maia escreveu:ficou bom (como na figura)
Gosto de GUI e TUI também. Esta tua tela é bem bonita, especialmente os cantos dos boxes. O que usa para desenhar?

HB_ZIPFILE e HB_UNZIPFILE

Enviado: 14 Jun 2023 11:53
por Jairo Maia
Olá Alexandre,
alxsts escreveu:O que usa para desenhar?
Obrigado pela opinião... Uso os recursos da GtWvg.