Arquivo .DBF corrompido (Read Error)

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Arquivo .DBF corrompido (Read Error)

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Arquivo .DBF corrompido (Read Error)

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

Código: Selecionar todos

IF .NOT. File( "BK-ANO-MES-DIA.ZIP")
   FazBackup()
ENDIF
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Arquivo .DBF corrompido (Read Error)

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Arquivo .DBF corrompido (Read Error)

Mensagem por JoséQuintas »

Tem razão. Só olhei o do while de fora.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Arquivo .DBF corrompido (Read Error)

Mensagem 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)
trooper7
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 19 Fev 2010 12:22
Localização: Ribeirão Preto/SP

Arquivo .DBF corrompido (Read Error)

Mensagem 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!
"É comum vermos os homens zombarem do que não podem compreender." (Goethe)
Responder