Eu tenho uma rotina que faz backup pelo ARJ versão 2.50a que tem várias opções de comando. Primeiro eu gero um arquivo texto (chamado FASE_001.LST e FASE_002.LST... quando a lista fica muito extensa), onde contém todos os arquivos que serão compactados (com o caminho completo onde se encontram). Depois executo o seguinte arquivo BAT:
O aplicativo MANUAL.EXE, serve para aparecer na tela uma janelinha que solicita a inserção de disquetes e aguarda confirmação:
Código: Selecionar todos
/*
TITULO : Sistema de loca‡„o de filmes
DESDE : 18/12/99
PROGRAMA : MANUAL.PRG
COMENTARIO : Solicita disquetes para o backup manual
Compilar manualmente sem op‡„o /B e com CT.LIB
*/
#include "loca.ch"
NOMECOR := { "FUNDO DA TELA","MENU","DESTAQUE DO MENU","JANELA DE DIALOGO","BOX DA JANELA DE DIALOGO","BOTOES","BOTAO EM DESTAQUE","GETS","GET EM DESTAQUE","REGISTROS MARCADOS","JANELA EM DESTAQUE","CERCADURAS","TITULO" }
CONTECOR := {}
TONACOR := {{},{},{}}
IF FILE( "C:LOCA.CFG" )
VAR := MEMOREAD( "C:LOCA.CFG" )
FOR CONTAR = 1 TO 13
AADD( CONTECOR, SUBS( VAR, ( CONTAR * 5 ) - 4, 5 ) )
NEXT
FOR I=1 TO 16
AADD(TONACOR[1], VAL(SUBS( VAR, ((I*6)-5)+105, 2 )) )
AADD(TONACOR[2], VAL(SUBS( VAR, ((I*6)-3)+105, 2 )) )
AADD(TONACOR[3], VAL(SUBS( VAR, ((I*6)-1)+105, 2 )) )
NEXT
ENDIF
IF !FILE("CONTADOR.MEM")
WNUM=1
WDIA=DATE()
WHORA=TIMETOSEC(TIME())
ELSE
RESTORE FROM CONTADOR ADDI
WNUM=WNUM+1
ENDIF
VQBACK=GETENV("BACKUP")
CLS
ObjBotao := botao:LIMPA()
SET DELE ON
SET DATE TO BRIT
SET CENTURY ON
SET CURSOR OFF
SAVE SCREEN TO PER_TELA
DO WHILE .T.
BEEP()
IF LEN(VQBACK)=0
JANELA(12,37,18,72,"Backup do Sistema")
@ 14,38 SAY PADC("Insira o disquete n§ "+ALLTRIM(STR(WNUM)),33) COLOR CONTECOR[4]
ELSE
JANELA(11,37,18,72,"Backup do Sistema")
@ 13,38 SAY PADC("Insira o disquete n§ "+ALLTRIM(STR(WNUM)),33) COLOR CONTECOR[4]
@ 14,38 SAY PADC(VQBACK,33) COLOR CONTECOR[4]
ENDIF
botao:ADD( 16,42, "Pronto " )
botao:ADD( 16,57, "Cancelar " )
SIM_NAO := botao:RODA()
IF LASTKEY()=27
SIM_NAO=2
ENDIF
RESTORE SCREEN FROM PER_TELA
IF SIM_NAO=2
@ 12,00 SAY ""
KBDEMULATE(CHR(3)+" "+CHR(13))
QUIT
ELSE
CLS
IF !DISKREADY("A")
LOOP
ELSE
IF !DISKREADYW("A")
BEEP()
JANELA(12,37,16,72,"Aten‡„o",.T.)
@ 14,39 SAY "Retire a prote‡„o do disquete !" COLOR CONTECOR[11]
INKEY(5)
LOOP
ENDIF
ENDIF
VA:=DIRECTORY("A:\*.*","D")
VARQS:={}
N=1
FOR I=1 TO LEN(VA)
IF !(SUBSTR(VA[I,1],1,1)=".")
AADD(VARQS,{VA[I,1],VA[I,3],VA[I,4],VA[I,5]})
N++
ENDIF
NEXT
RELEASE VA
IF LEN(VARQS)>0
IF MOSTRA(VARQS)=.T.
IF WNUM=1
SAVE TO CONTADOR ALL LIKE W*
ELSE
SAVE TO CONTADOR ALL LIKE W*
ENDIF
@ 00,00 SAY ""
QUIT
ELSE
LOOP
ENDIF
ENDIF
IF WNUM=1
SAVE TO CONTADOR ALL LIKE W*
ELSE
SAVE TO CONTADOR ALL LIKE WNUM*
ENDIF
@ 00,00 SAY ""
QUIT
ENDIF
ENDDO
FUNCTION MOSTRA(VARQS)
VT=LEN(VARQS)
VNAR=SUBSTR(RIGHT(ALLTRIM(LEFT(VQBACK,8)),5),1,3)
VFAR=ALLTRIM(LEFT(VQBACK,8))
VOQUE=""
IF "P" $ VFAR
VOQUE=VOQUE+"P"
ENDIF
IF "D" $ VFAR
VOQUE=VOQUE+"D"
ENDIF
N=0
FOR I=1 TO VT
IF SUBSTR(RIGHT(VARQS[I,1],9),1,3)=VNAR .AND. VOQUE $ VARQS[I,1]
N++
ENDIF
NEXT
IF N>0
BEEP()
ALERT("N„o pode gravar neste disquete !.;Este disquete pertence ao backup.")
RETURN .F.
ENDIF
SAVE SCREEN TO PER_TELA1
IF VT>28
VTAM=28
ELSE
VTAM=VT
ENDIF
JANELA(00,31,ROUND((VTAM/2),0)+1,79,ALLTRIM(STR(VT))+(IF(VT=1," Arquivo encontrado"," Arquivos encontrados")))
IF VT>VTAM
@ 15,72 SAY "mais..."
ENDIF
VX=1
FOR I=1 TO VTAM STEP 2
IF I>VT
@ VX,33 SAY SPACE(21) COLOR CONTECOR[4]
ELSE
IF VARQS[I,4]="D"
@ VX,33 SAY PADR(VARQS[I,1],12)+" <DIR> " COLOR CONTECOR[4]
ELSE
@ VX,33 SAY PADR(VARQS[I,1],12)+" "+SUBSTR(DTOC(VARQS[I,2]),1,6)+RIGHT(DTOC(VARQS[I,2]),2) COLOR CONTECOR[4]
ENDIF
ENDIF
IF I+1>VT
@ VX,57 SAY SPACE(21) COLOR CONTECOR[4]
ELSE
IF VARQS[(I+1),4]="D"
@ VX,57 SAY PADR(VARQS[(I+1),1],12)+" <DIR> " COLOR CONTECOR[4]
ELSE
@ VX,57 SAY PADR(VARQS[(I+1),1],12)+" "+SUBSTR(DTOC(VARQS[(I+1),2]),1,6)+RIGHT(DTOC(VARQS[(I+1),2]),2) COLOR CONTECOR[4]
ENDIF
ENDIF
VX++
NEXT
JANELA(17,42,23,72,"Aten‡„o",.T.)
@ 19,43 SAY PADC((IF(VT=1,"Pode remove-lo ?","Pode remove-los ?")),28) COLOR CONTECOR[11]
botao:ADD( 21,47, "Sim " )
botao:ADD( 21,58, "N„o " )
SIM_NAO := botao:RODA()
RESTORE SCREEN FROM PER_TELA1
IF SIM_NAO=1
FILEDELETE("A:\*.*")
VRET=.T.
ELSE
VRET=.F.
ENDIF
RETURN VRET
FUNCTION BOTAO( LINHA_SUPERIOR, COLUNA_ESQUERDA, NOME_BOTAO )
LOCAL TIPO_OPERACAO, LARGURA_BOTAO, CONTAR, TECLA, PONTEIRO := 1
VQCOR=NTOCOLOR(SCREENATTR((OBJBOTAO[1,1])-1,OBJBOTAO[1,2]),.F.)
IF PCOUNT() = 0
TIPO_OPERACAO := EDITA_BOTOES
ELSEIF PCOUNT() = 1
TIPO_OPERACAO := EDITA_BOTOES
PONTEIRO := LINHA_SUPERIOR
ELSEIF PCOUNT() = 2
TIPO_OPERACAO := MOSTRA_BOTOES
ELSEIF PCOUNT() = 3
TIPO_OPERACAO := MOVIMENTA_BOTAO
ENDIF
IF TIPO_OPERACAO = MOVIMENTA_BOTAO
LARGURA_BOTAO := LEN( NOME_BOTAO ) + 2
SETCOLOR(VQCOR)
@ LINHA_SUPERIOR, COLUNA_ESQUERDA SAY " "
@ LINHA_SUPERIOR + 1, COLUNA_ESQUERDA - 1 SAY SPACE( LARGURA_BOTAO )
@ LINHA_SUPERIOR, COLUNA_ESQUERDA + LARGURA_BOTAO - 1 SAY " "
SETCOLOR(CONTECOR[07]+"*")
@ LINHA_SUPERIOR, COLUNA_ESQUERDA - 1 SAY " " + NOME_BOTAO + " "
INKEY( .2 )
COR( "BOTOES" )
@ LINHA_SUPERIOR, COLUNA_ESQUERDA SAY " " + NOME_BOTAO + " "
SETCOLOR( "N/" + ALLTRIM( SUBS( VQCOR, 4 ) ) )
@ LINHA_SUPERIOR, COLUNA_ESQUERDA - 1 SAY "Ü"
@ LINHA_SUPERIOR + 1, COLUNA_ESQUERDA - 1 SAY REPL( "ß", LARGURA_BOTAO ) + " "
INKEY( .2 )
ENDIF
IF TIPO_OPERACAO = EDITA_BOTOES .OR. TIPO_OPERACAO = MOSTRA_BOTOES
FOR CONTAR := 1 TO LEN( ObjBotao )
LARGURA_BOTAO := LEN( ObjBotao[ CONTAR ][ 3 ] ) + 2
COR( "BOTOES" )
@ ObjBotao[ CONTAR ][ 1 ], ObjBotao[ CONTAR ][ 2 ] SAY " "+ObjBotao[ CONTAR ][ 3 ] + " "
SETCOLOR( "N/" + ALLTRIM( SUBS( VQCOR, 4 ) ) )
@ ObjBotao[ CONTAR ][ 1 ], ObjBotao[ CONTAR ][ 2 ] - 1 SAY "Ü"
@ ObjBotao[ CONTAR ][ 1 ] + 1, ObjBotao[ CONTAR ][ 2 ] - 1 SAY REPL( "ß", LARGURA_BOTAO ) + " "
NEXT
ENDIF
IF TIPO_OPERACAO = EDITA_BOTOES
TECLA := 0
WHILE .T.
LARGURA_BOTAO := LEN( ObjBotao[ PONTEIRO ][ 3 ] ) + 2
SETCOLOR(CONTECOR[07]+"*")
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] SAY " "+ObjBotao[ PONTEIRO ][ 3 ] + " "
SETCOLOR( "N/" + ALLTRIM( SUBS( VQCOR, 4 ) ) )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY "Ü"
@ ObjBotao[ PONTEIRO ][ 1 ] + 1, ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY REPL( "ß", LARGURA_BOTAO ) + " "
IF TECLA = T_ENTER
INKEY( .2 )
botao:LIMPA()
RETURN PONTEIRO
ENDIF
TECLA := INKEY( 0 )
IF TECLA = T_F1
botao:LIMPA()
RETURN 28
ENDIF
IF TECLA = T_ESC
botao:LIMPA()
RETURN 0
ENDIF
COR( "BOTOES" )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] + 1 SAY ObjBotao[ PONTEIRO ][ 3 ]
FOR CONTAR = 1 TO LEN( ObjBotao )
IF SUBS( ObjBotao[ CONTAR ][ 3 ], 1, 1 ) = UPPER( CHR( TECLA ) )
PONTEIRO := CONTAR
TECLA := T_ENTER
EXIT
ENDIF
NEXT
IF TECLA = T_ENTER
LARGURA_BOTAO := LEN( ObjBotao[ PONTEIRO ][ 3 ] ) + 2
SETCOLOR( "N/" + ALLTRIM( SUBS( VQCOR, 4 ) ) )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] SAY " "
@ ObjBotao[ PONTEIRO ][ 1 ] + 1, ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY SPACE( LARGURA_BOTAO )
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] + LARGURA_BOTAO - 1 SAY " "
SETCOLOR(CONTECOR[07]+"*")
@ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY " " + ObjBotao[ PONTEIRO ][ 3 ] + " "
INKEY( .2 )
LOOP
ENDIF
IF TECLA = T_ESQUERDA .OR. TECLA = T_CIMA
PONTEIRO--
ELSEIF TECLA = T_DIREITA .OR. TECLA = T_BAIXO
PONTEIRO++
ENDIF
PONTEIRO := IIF( PONTEIRO < 1, LEN( ObjBotao ),IIF( PONTEIRO > LEN( ObjBotao ), 1, PONTEIRO ) )
ENDDO
ENDIF
botao:LIMPA()
RETURN NIL
FUNCTION COR( NOM_COR )
QUAL_COR := ASCAN( NOMECOR, UPPER( NOM_COR ) )
IF QUAL_COR != 0
IF QUAL_COR = 2
SETCOLOR( CONTECOR[ 2 ] + "," + CONTECOR[ 3 ] + ",,," + CONTECOR[ 2 ] )
ELSEIF QUAL_COR = 8
SETCOLOR( CONTECOR[ 11 ] + "," + CONTECOR[ 9 ] + ",,," + CONTECOR[ 8 ] )
ELSE
SETCOLOR( CONTECOR[ QUAL_COR ] )
ENDIF
ENDIF
RETURN .T.
FUNCTION JANELA( PJAN1, PJAN2, PJAN3, PJAN4, PJAN5, PJAN6 )
IF PJAN5=NIL
PJAN5 := ""
ENDIF
SOMBRA( PJAN1, PJAN2, PJAN3, PJAN4 )
IF PJAN6=NIL
SETCOLOR( CONTECOR[ 4 ] )
ELSE
SETCOLOR( CONTECOR[ 11 ] )
ENDIF
@ PJAN1, PJAN2 CLEAR TO PJAN3, PJAN4
SETCOLOR( CONTECOR[ 5 ] )
@ PJAN1, PJAN2, PJAN3, PJAN4 BOX " "
@ PJAN1, PJAN2 SAY "þ"
IF LEN( TRIM( PJAN5 ) ) > 0
@ PJAN1, PJAN2 + ( ( ( PJAN4 + 1 - PJAN2 ) - LEN( PJAN5 ) ) / 2 ) SAY PJAN5
ENDIF
RETURN NIL
FUNCTION SOMBRA( LIN_SUP, COL_SUP, LIN_INF, COL_INF )
IF PCOUNT() = 2 .OR. PCOUNT() = 3
C_SOM := COL_SUP; L_SOM := LIN_SUP
LIN_SUP := VAL( SUBS( C_SOM, 1, 2 ) )
COL_SUP := VAL( SUBS( C_SOM, 3, 2 ) )
LIN_INF := VAL( SUBS( C_SOM, 5, 2 ) )
COL_INF := VAL( SUBS( C_SOM, 7, 2 ) )
COL_SOM := SUBS( C_SOM, 9 )
LIN_SOM := L_SOM
ENDIF
IF COL_SUP < 2 .OR. LIN_INF > 22
C_SOM := ""; L_SOM := ""
RETURN .F.
ENDIF
IF PCOUNT() = 3
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .F.
ENDIF
IF PCOUNT() != 2
COL_SOM := SAVESCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1 )
LIN_SOM := SAVESCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2 )
ENDIF
IF SUBS( COL_SOM, 2, 1 ) != CHR( 8 )
C_SOM := STR( LIN_SUP, 2 ) + STR( COL_SUP, 2 ) + STR( LIN_INF, 2 ) + STR( COL_INF, 2 ) + COL_SOM
L_SOM := LIN_SOM
ENDIF
FOR I = 2 TO LEN( COL_SOM ) STEP 2
COL_SOM := STUFF( COL_SOM, I, 1, CHR( 8 ) )
NEXT
FOR I = 2 TO LEN( LIN_SOM ) / 2 STEP 2
LIN_SOM := STUFF( LIN_SOM, I, 1, CHR( 8 ) )
NEXT
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .T.
* Final do programa MANUAL.PRG
O MSG_BKP.EXE, serve para dar mensagem na tela se o backup foi realizado com ou sem sucesso:
Espero que tenha servido para o se propósito, vale a pena compilar.