Página 2 de 2
Arquivo .DBF corrompido (Read Error)
Enviado: 04 Nov 2013 21:08
por JoséQuintas
Tem coisa errada na rotina acima.
Não tem SKIP, vai ficar em LOOP infinito.
A sugestão é uma rotina parecida com a acima, navegando pelo número de registro.
Se for erro de disco, mais chances de recuperar.
Na prática é testar todas as opções, afinal só você vai conseguir detectar qual o que deu melhor resultado para o seu caso.
Código: Selecionar todos
USE ArquivoRuim
nLastRec := LastRec()
FOR nCont = 1 TO nLastRec
BEGIN SEQUENCE
GOTO (nCont)
grava()
END SEQUENCE
NEXT
Outra opção também, já que falou que trava no meio é:
- Processa tudo que der desde o começo
- Processa de trás pra frente tudo que der.
Pode adicionar um campo no arquivo recuperado, pra gravar o número de registro original
Depois é pegar os números que faltarem e ver o que dá pra fazer.
Arquivo .DBF corrompido (Read Error)
Enviado: 04 Nov 2013 21:18
por JoséQuintas
Só um comentário, de algo que uso até hoje:
Ao abrir o sistema no dia, na primeira vez, faço backup.
Algo simples:
Não resolve seu problema, mas evita problemas futuros.
De quebra, pode ter backup de vários dias anteriores, ou até meses.
Por exemplo, os últimos 30 dias, e mais velho que isso, só o primeiro de cada mês.
Só gerenciar pelo aplicativo e pronto, não precisa mais se preocupar.
Foram muitas poucas vezes que precisei do backup, mas nessas vezes resolveu.
Também faço isso automaticamente na troca de versão, quando altero o número interno de versão de DBFs (tipo mudança de estrutura, etc)
No Harbour mais fácil, uso a rotina de ZIP que ele já tem.
Arquivo .DBF corrompido (Read Error)
Enviado: 04 Nov 2013 21:32
por alxsts
Olá!
Onde falta o Skip Quintas? Na minha rotina? Se for, olhe a linha 24.
Eu só mudaria o tratamento do RECOVER, para pegar uma sequência de registros ruins:
Código: Selecionar todos
RECOVER USING oErr
//Catch oErr // para xHarbour
WHILE FError() != 0 .AND. InFile->( ! Eof() )
Alert( "Registro com problema sendo ignorado. Recno(): " + LTrim( Str( InFile->( Recno() ) ) ) + ;
Chr(13) + Chr(10) + "Dos Error :" + LTrim( Str( FError() ) ) + ;
Chr(13) + Chr(10) + "GenCode :" + LTrim( Str( oErr:genCode ) ) + ;
Chr(13) + Chr(10) + "Descrição :" + LTrim( oErr:description ) ;
)
InFile->( DbSkip() )
ENDDO
LOOP
END //SEQUENCE
Arquivo .DBF corrompido (Read Error)
Enviado: 05 Nov 2013 00:19
por JoséQuintas
Tem razão. Só olhei o do while de fora.
Arquivo .DBF corrompido (Read Error)
Enviado: 05 Nov 2013 17:21
por Eolo
Tropper, o Alex e os outros já deram soluções mais "técnicas", mas aqui vai o meu jeitão.
A linha abaixo mostra o nome e tamanho do campo, ao lado do foi lido no DBF (via baixo nivel) com o FREADSTR(). Vc pode substituí-la, colocando os valores de cada campo em GETs, aí dá pra editar manualmente, registro por registro... Além disso, pode incluir o REPLACE automático dos valores para outro DBF.
? pad(estru[x,1],10)+" "+pad(str(estru[x,3]),10)+" "+substr(txt,inicio,quantos)
EDITADO: A "vantagem" da FOPEN e FREAD é que elas não "sabem" que o arquivo DBF está corrompido. Pra elas, arquivos DBF, EXE, TXT, DLL etc são todos iguais.
Código: Selecionar todos
use teste excl new
cabec:=header()+1
tamreg:=recsize()
estru:=dbstruct()
use
handle:=fopen("teste.dbf",18)
fseek(handle,cabec,0) //pula o header
do whil .t.
txt=freadstr(handle,tamreg)
if len(txt)=0
exit
endi
inicio:=1
for x=1 to len(estru)
quantos:=estru[x,3]
? pad(estru[x,1],10)+" "+pad(str(estru[x,3]),10)+" "+substr(txt,inicio,quantos)
inicio=inicio+quantos
next
wait
endd
fclose(handle)
Arquivo .DBF corrompido (Read Error)
Enviado: 06 Nov 2013 08:15
por trooper7
Bom dia, pessoal!
Agradeço muito pela ajuda e pelas dicas! Me ajudaram muito e com certeza eu sei que vão me ajudar ainda mais no futuro, inclusive a adoção de uma função específica como a FazBackup()! rs
Havia realmente um problema físico no Disco Rígido. Assim que ele foi trocado, eu passei o comando fsck para recuperação no linux, e logo em seguida passei 3 vezes o Regenerator, um programinha leve, bem simples de usar, mas muito potente, que recuperou todos os blocos danificados do antigo HD. E em alguns destes blocos estavam os arquivos de dados.
Testei os códigos enviados, mais para verificar a integridade de alguns arquivos que me deram mais dor de cabeça. Mas está tudo ok com eles agora!
Mais uma vez, obrigado pela atenção de todos!
Grande abraço!