Página 1 de 2

Busca de Unidades no Computador

Enviado: 19 Fev 2010 12:12
por Laudelino Scarmagnani
Pessoal, bom dia!
Alguem tem algo parecido, ou sabe se tem como,
preciso criar uma rotina de BackUp simples, para copia em penDrive. Só que o penDrive, uma hora é G:, outra é F:,
desta forma não da para fezer um arquivo.bat para executar.
Fiz no sistema os seguintes comandos

Código: Selecionar todos

   close all
   OPCAO = 0
   @ 12,25 CLEAR TO 15,69
   @ 12,25 TO 16,69 DOUBLE
   @ 13,26 SAY 'Informe a data ........:' get wdata
   clear gets
   @ 15,26 say 'Informe Unidade p/Salva:' get WDISQUE PICT '@!'
   READ
   IF LASTKEY() =   27
      close all
      return
   ENDIF
   
   ADISK = CURDRIVE()
   IF !DISKCHANGE(WDISQUE)
      @24,01 CLEAR TO 24,79
      @24,05 SAY 'Unidade Fisica para Salva Nao Disponivel'
      INKEY(0)
      Loop
   endif
   DISKCHANGE(adisk)
   if .not.empty(SgCodNota)
	wmov = substr(sgcodnota,1,4)
	WMOV = alltrim(wmov)+STRZERO(sglocatu,2,0)+SUBSTR(DTOC(WDATA),1,2)+'.ZIP'
    else  
                WMOV = 'Back'+STRZERO(sglocatu,2,0)+SUBSTR(DTOC(WDATA),1,2)+'.ZIP'
    endif
   
    run pkzip &Wmov *.dbf

   DO CASE
     CASE WDISQUE = 'A'
          run del A:&wmov
          RUN COPY &WMOV A:
     CASE WDISQUE = 'D'
          run del D:&wmov
          RUN COPY &WMOV D:
     CASE WDISQUE = 'F'
          run del F:&wmov
          RUN COPY &WMOV F:
     CASE WDISQUE = 'G'
...
esta rotina, busquei exemplos aqui no forum.
Tem como mostrar a relaçao de unidade pendentes, o usuario escolher, guardar isso numa variável e e no comando run copy informa-la?
Abracos, Laudelino.

Re: Busca de Unidades no Computador

Enviado: 19 Fev 2010 20:14
por rochinha
Amiguinho,

Identifique o PedDrive:

Coloque um arquivo com atributo somente de leitura e faça uma verificação tipo:

Código: Selecionar todos

if file( "E:\PENDRIVE.TXT" )
   ...
if file( "F:\PENDRIVE.TXT" )
   ...
if file( "G:\PENDRIVE.TXT" )
   ...
Ou use o comando VOL do DOS para dar um nome ao PenDrive e use a função remanescente do Clipper, VOL() ou VOLUME(), se não me engano.

Re: Busca de Unidades no Computador

Enviado: 19 Fev 2010 21:23
por Laudelino Scarmagnani
Rochinha, obrigado. A busca do pendrive funcionou. Agora, o sistema gera o arquivo zipado, porem não copia. retorna a mesagem de erro. O codigo é o seguinte:

Código: Selecionar todos

if .not.empty(SgCodNota)
      wmov = substr(sgcodnota,1,4)
      WMOV = alltrim(wmov)+STRZERO(sglocatu,2,0)+SUBSTR(DTOC(WDATA),1,2)+'.ZIP'
else  
      WMOV = 'Back'+STRZERO(sglocatu,2,0)+SUBSTR(DTOC(WDATA),1,2)+'.ZIP'
endif
run pkzip &Wmov *.dbf
@24,01 CLEAR TO 24,79
@24,05 SAY 'ARQUIVO ' + Wmov + ' SERA COPIADO PARA UNIDADE ' + WDISQUE 
INKEY(0)
CDIR = WDISQUE + ':' + ALLTRIM(WMOV)
RUN DEL (CDIR)
RUN COPY (WMOV) TO (CDIR)
	
*run del &(WDISQUE):&(wmov)
*RUN COPY &(WMOV) TO &(WDISQUE): ///\&(WMOV)
   
IF !FILE(CDIR)
      @24,01 CLEAR TO 24,79
      @24,05 SAY 'ARQUIVO ' + Wmov + 'NAO COPIADO PARA ' + CDIR + ', PROVIDENCIE!'
      INKEY(0)
ENDIF
Não funcionou nem com a parte comentada com *, e não consigo captar o erro.
Laudelino.

Re: Busca de Unidades no Computador

Enviado: 19 Fev 2010 23:34
por rochinha
Amiguinho,

Antes de:

Código: Selecionar todos

run pkzip &Wmov *.dbf
De um comando:

Código: Selecionar todos

? WMOV
e veja o conteudo, pois algum espaço ou caractere estranho pode atrapalhar o PKZIP de funcionar.

Sugiro que voce crie e .ZIP e depois copie ou crie um .BAT com o conteudo do comando e dê um RUN nele:

Código: Selecionar todos

memowrit( "ZIPA.BAT", "PKZIP "+wmov )
run ZIPA.BAT
Verifique também se o PKZIP.EXE esta na mesma pasta do seu sistema ou passe o caminho completo para o comando RUN.

Código: Selecionar todos

run c:\utilidades\pkzip\pkzip.exe &Wmov *.dbf

Re: Busca de Unidades no Computador

Enviado: 23 Fev 2010 21:58
por Laudelino Scarmagnani
Olá pessoal, boa noite!
Seguinte, consegui fazer o BackUp dos arquivos DBF, do diretorio do sistema.
O ACBr gera uma pasta mensal no formato CCYYMM/NFE com os arquivos das NFe. Teria uma forma de o sistema, emitir um backup da pasta do mes em curso, toda vez que o usuario emite um BackUp do sistema? Como seria este comando, para montar o caminho de backup?
Laudelino.

Re: Busca de Unidades no Computador

Enviado: 24 Fev 2010 11:29
por alaminojunior
Eu uso o seguinte:

Código: Selecionar todos

Function Backup
local bTela:= savescreen(00,00,34,79), cDrive, i, cLabel, linha:= 14
clos data
hb_shadow(10,17,23,57)
criabox3dw(10,17,23,58)
hb_shadow(10,60,23,76)
criabox3dw(10,60,23,77)
@ 11,61 say padc("Unidades",15) colo "n/w"
FOR i:=1 TO 26
    cDrive := Chr(64+i) + ":\"
    cLabel := GetVolInfo( cDrive )
    IF .NOT. Empty( cLabel )
       @ linha,61 say cDrive colo "r+/w"
		 @ linha,64 say left(cLabel,14) colo "b/w"
       linha++
    ENDIF
NEXT
priv unidade:= space(1)
wvt_drawboxget(17,38,1)
@ 11,18 say padc("C¢pia de Seguran‡a",40) colo "n/w"
@ 13,22 say "Digite letra da unidade de backup" colo "b/w"
@ 17,38 get unidade colo "r/w*" pict "@!"
set conf on
read
set conf off
if lastkey() = 27 .or. !confirma()
   restscreen(00,00,34,79,bTela)
   return
endif
deletefile("&unidade:\data0001.zip")
deletefile("&unidade:\data0002.zip")
deletefile("&unidade:\data0003.zip")
@ 17,16 say padc("AGUARDE, EFETUANDO BACKUP ...",46) colo "r/w"
vNome_zip1 := "&unidade:\data0001.zip"
vNome_zip2 := "&unidade:\data0002.zip"
vNome_zip3 := "&unidade:\data0003.zip"
aDir1 := curdrive()+":\"+rtrim(curdir()) + "\*.dbf"
aDir2 := curdrive()+":\"+rtrim(curdir()) + "\pdv\*.dbf"
aDir3 := curdrive()+":\"+rtrim(curdir()) + "\sintegra\*.txt"
// arquivo final, arquivo de origem, nível, codeblock, sobreescreve, senha, lpath, ldrive,
if !hb_zipfile( vNome_zip1,adir1, 9, ,.T., "oiubiuytuyrt",.F.,.F.,)
   wvt_messagebox("Backup 1 nao foi concluido, verifique !!!","ATENCAO",48)
endif
if !hb_zipfile( vNome_zip2,adir2, 9, ,.T., "ertertrtytyn",.F.,.F.,)
   wvt_messagebox("Backup 2 nao foi concluido, verifique !!!","ATENCAO",48)
endif
if !hb_zipfile( vNome_zip3,adir3, 9, ,.T., "ioytubseawvy",.F.,.F.,)
   wvt_messagebox("Backup 3 nao foi concluido, verifique !!!","ATENCAO",48)
   rele unidade
   restscreen(00,00,34,79,bTela)
   return
endif
wvt_messagebox("BACKUP CONCLUIDO COM SUCESSO","COPIA DE SEGURANCA",48)
rele unidade
restscreen(00,00,34,79,bTela)
return

Re: Busca de Unidades no Computador

Enviado: 24 Fev 2010 18:36
por Laudelino Scarmagnani
Boa noite.
Ao compilar, reclamou das funções
hb_zipfile()
confirma()
criabox3dw()
O que iria nas funções?

Re: Busca de Unidades no Computador

Enviado: 24 Fev 2010 18:46
por alaminojunior
Ah sim, esquecí de comentar sobre. Mas é o seguinte:

Código: Selecionar todos

hb_zipfile()
Precisa linkar a HBZIP.LIB junto com o resto do projeto. Eu passei a utilizar esta função, no lugar do famoso PKZIP, pois aquela tela preta do DOS, convenhamos.....dá um arzinho de coisa enxertada. Em certos casos não tem como fugir, mas se temos a hb_zipfile(), façamos uso.

Código: Selecionar todos

confirma()
Esta é uma funçãozinha simples de confirmação, que retorna .t. ou .f., implemente uma que já utilize.

Código: Selecionar todos

criabox3dw()
Esta monta um box na tela, com as coordenadas. Utilize alguma que já utilize, ou use @ ..to ..

Se quiser, posso postar a minha também. Só avisar.

Re: Busca de Unidades no Computador

Enviado: 24 Fev 2010 21:29
por Laudelino Scarmagnani
Boa noite AlaminoJunior,
Consegui fazer funcionar. Vou fazer uns testes do retorno destes dados. Este utilitario é mais demorado que PKZIP? Demorou um montão aqui, se for normal, o imprtante é que é seguro e posso gerar um log com os backups feitos,e caso não o faça, me enviar um email, ou enviar ao escritório do cliente para as providencias.
Tenho alguma dificuldade em enviar email. Uso uma rotina que baixei aqui no forum. Funciona nos testes aqui em casa, mas no cliente, ainda não.
Laudelino.

Re: Busca de Unidades no Computador

Enviado: 24 Fev 2010 21:33
por Laudelino Scarmagnani
Alamino,
Ao restaurar, pediu uma senha de encriptacao, o que é isto?
Laudelino.

Re: Busca de Unidades no Computador

Enviado: 24 Fev 2010 22:08
por alaminojunior
É a senha: reveja o exemplo.

Código: Selecionar todos

// arquivo final, arquivo de origem, nível, codeblock, sobreescreve, senha, lpath, ldrive,
if !hb_zipfile( vNome_zip1,adir1, 9, ,.T., "oiubiuytuyrt",.F.,.F.,)
Sobre o e-mail, deve ter por aí, mas segue mastigado:

Código: Selecionar todos

Function envia_email(arq) // arq é o arquivo para anexar
local cSubject  := assunto // assunto é o assunto
local        aTo:= { destino } // destino pode ser uma array com os destinatários
local cServerIp := alltrim(cdpar000->msmtp) // servidor smtp
local cFrom     := alltrim(cdpar000->muser) // remetente
local cUser     := alltrim(cdpar000->muser) // remetente
local cMsg      := obs // corpo do email
cPass           := alltrim(cdpar000->mpswd) // senha
porta           := val(cdpar000->mport) // porta usada para transmissão, geralmente a 25
pop3            := alltrim(cdpar000->mpop3) // servidor pop
aarq:= {}
aadd(aarq,arq) // note que vc pode enviar uma array com vários arquivos para anexar
if hb_SendMail(cServerIP,porta,cFrom,aTo, , , cMsg,cSubject,aarq ,cUser, cPass, pop3 ,3, .T. , .T. ,.T. , .F. )=.T.
   wvt_messagebox("E-mail enviado com sucesso.","EMAIL",48)
else
   wvt_messagebox("Falha na transmissao da mensagem, verifique.","EMAIL",48)
endif
return
Lembrando que não funciona com servidores Gmail ou Hotmail. Pelo menos ainda não conseguí.

As funções wvt_... pode trocar por alert() ou similar.

Boa sorte.

Re: Busca de Unidades no Computador

Enviado: 15 Fev 2011 00:01
por lugab
Ola pessoal,

Achei muito legal esse código q o Alamino Jr postou, mas ficou uma dúvida :

Como fazer se eu desejar zipar meus .DBF + .FPT +.CDX dentro do mesmo arquivo .ZIP , tipo, todos eles em data0001.zip, em vez de cada tipo em um zip diferente ?


A seguir o trecho do código q deve ser alterado...

Código: Selecionar todos

vNome_zip1 := "&unidade:\data0001.zip"
vNome_zip2 := "&unidade:\data0002.zip"
vNome_zip3 := "&unidade:\data0003.zip"
aDir1 := curdrive()+":\"+rtrim(curdir()) + "\*.dbf"
aDir2 := curdrive()+":\"+rtrim(curdir()) + "\*.fpt"
aDir3 := curdrive()+":\"+rtrim(curdir()) + "\*.cdx"
// arquivo final, arquivo de origem, nível, codeblock, sobreescreve, senha, lpath, ldrive,
if !hb_zipfile( vNome_zip1,adir1, 9, ,.T., "oiubiuytuyrt",.F.,.F.,)
 wvt_messagebox("Backup 1 nao foi concluido, verifique !!!","ATENCAO",48)
endif
if !hb_zipfile( vNome_zip2,adir2, 9, ,.T., "ertertrtytyn",.F.,.F.,)
 wvt_messagebox("Backup 2 nao foi concluido, verifique !!!","ATENCAO",48)
endif
if !hb_zipfile( vNome_zip3,adir3, 9, ,.T., "ioytubseawvy",.F.,.F.,)
 wvt_messagebox("Backup 3 nao foi concluido, verifique !!!","ATENCAO",48)
 rele unidade
Só pra constar, eu lembro que usando o velho PKZIP.EXE , a linha de comando pra fazer a mesma coisa seria assim:

Código: Selecionar todos

PKZIP -R -P ARQ0001  *.DBF *.FPT *.CDX
Grato,

Gabriel

Re: Busca de Unidades no Computador

Enviado: 15 Fev 2011 07:19
por Toledo
Gabriel, tente o seguinte:

Código: Selecionar todos

vNome_zip1 := "&unidade:\data0001.zip"
aDir1 := {curdrive()+":\"+rtrim(curdir()) + "\*.dbf",;
          curdrive()+":\"+rtrim(curdir()) + "\*.fpt",;
          curdrive()+":\"+rtrim(curdir()) + "\*.cdx"}
// arquivo final, arquivo de origem, nível, codeblock, sobreescreve, senha, lpath, ldrive,
if !hb_zipfile( vNome_zip1,aDir1, 9, ,.T., "oiubiuytuyrt",.F.,.F.,)
 wvt_messagebox("Backup 1 nao foi concluido, verifique !!!","ATENCAO",48)
endif
Abraços,

Re: Busca de Unidades no Computador

Enviado: 15 Fev 2011 08:56
por lugab
Toledo, necas de pitibiriba.

Não acusou nenhum erro de sintaxe no código abaixo, porém só entraram no .ZIP os tipos .DBF mesmo.

Código: Selecionar todos

aDir1 := {curdrive()+":\"+rtrim(curdir()) + "\*.dbf",;
     curdrive()+":\"+rtrim(curdir()) + "\*.fpt",;
     curdrive()+":\"+rtrim(curdir()) + "\*.cdx"}
E agora que eu reparei outra coisa que ocorre no código abaixo, desde o início dos meus testes: Mesmo gerando ZIPS em separado, os .DBF, FPT e CDX das subpastas não entraram no zip.

Código: Selecionar todos

if !hb_zipfile( vNome_zip1,aDir1, 9, ,.T., "oiubiuytuyrt",.F.,.F.,)
// arq fin, arq orig nível, codeblock, sobreescreve, senha, lpath, ldrive,
 wvt_messagebox("Backup 1 nao foi concluido, verifique !!!","ATENCAO",48)
endif
Parece q essa Hbzip.lib é limitada mesmo...

Mas mesmo assim eu aprendi mais coisas, obrigado..

Gabriel

Re: Busca de Unidades no Computador

Enviado: 15 Fev 2011 10:10
por Toledo
Gabriel, olhando o arquivo fonte da função hb_zipfile() notei que existe um pequeno erro quando você passa uma matriz com o caminho e nome dos arquivos com caracteres coringa (? ou *). A função gera uma outra matriz com o nome de todos os arquivos que devem serem zipados, mas pega apenas o nome, desprezando o caminho onde o arquivo está. Então por este motivo o arquivo ZIP gerado pela função vem vazio.

Mas se os arquivos que você quer copiar estão na mesma pasta do seu EXE, você pode usar assim:

Código: Selecionar todos

aDir1 := {"*.DBF","*.FPT","*.CDX"}
if !hb_zipfile( vNome_zip1,aDir1, 9, ,.T., "oiubiuytuyrt",.F.,.F.,)
// arq fin, arq orig nível, codeblock, sobreescreve, senha, lpath, ldrive,
 wvt_messagebox("Backup 1 nao foi concluido, verifique !!!","ATENCAO",48)
endif
lugab escreveu:Não acusou nenhum erro de sintaxe no código abaixo, porém só entraram no .ZIP os tipos .DBF mesmo.
Gabriel, provavelmente o arquivo ZIP já existia e já tinha os arquivos .DBF. Mas como expliquei acima, o arquivo gerado fica sempre vazio.

Abraços,