Página 1 de 2

Recuperar arquivo DBF danificado

Enviado: 14 Jul 2015 11:45
por rossine
Olá pessoal,

Já procurei aqui no forum e vi algumas soluções indicando o filefix, recoverdbf, etc... mas não adiantou.

Teria como recuperar um arquivo DBF através de algum programa feito em harbour ?

Tenho um arquivo que o cabeçalho está corrompido e eu estava pensando se alguém teria alguma solução usando o fread/fwrite para identificar e corrigir este tipo de problema.

Obrigado,

Rossine.

Recuperar arquivo DBF danificado

Enviado: 14 Jul 2015 11:47
por rossine
Olá,

Só para esclarecer sobre o erro que está ocorrendo.

O erro ocorrido é:

Error DBFCDX/1012 Corruption detected: TESTE.DBF

Obs: Este arquivo não tem campo MEMO.

Obrigado,

Rossine.

Recuperar arquivo DBF danificado

Enviado: 14 Jul 2015 14:14
por Pablo César
Oi Rossine,

En Harbour, desconheço algum aplicativo. Até agora o melhor que eu conheço é o FileFix do antigo Norton Utilities. E ele recupera a estrutura do dbf importando desde outro dbf que não esteja baleado.
rossine escreveu: Este arquivo não tem campo MEMO.
Facilita, ainda bem. Se bem que para recriar DBTs é facil.

sds

Recuperar arquivo DBF danificado

Enviado: 14 Jul 2015 14:27
por rossine
Olá Pablo,

Eu tentei rodar o filefix.exe mas ele está em 16bits e estou usando o windows 7 em 32 bits.

Existe ele para 32bits ?

Obrigado,

Rossine.

Recuperar arquivo DBF danificado

Enviado: 14 Jul 2015 14:37
por Pablo César
Lamentavelmente não. Tente numa maq antiga ou utilize um emulador.

Recuperar arquivo DBF danificado

Enviado: 14 Jul 2015 21:52
por Itamar M. Lins Jr.
Poxa!
Da vez que precisei, acho que usei o PCTOOLS! ;-) //Hoje é antivírus nada a ver...
Usei para reconstruir o HEAD do DBF usando um 80286... bons tempos!

Saudações,
Itamar M. Lins Jr.

Recuperar arquivo DBF danificado

Enviado: 14 Jul 2015 23:37
por fladimir
Conheço e tenho os seguintes:

FileFix
FixDBF = QuickFix
FixHead

Não sei se são todos 16 bits, mas rodou no XP aki tranquilo via emulador, se vc tem eles instala numa Maquina Virtual um SO tipo XP q vc roda eles.

Se não tiver como e quiser mandar o DBF q rodo aki e se der certo te devolvo corrigido.

[]´s

Recuperar arquivo DBF danificado

Enviado: 15 Jul 2015 00:35
por rossine
Olá Fladimir,

O problema é ao que parece que o tal antivirus kapersky detonou vários dbf's no meu cliente ou o HD dele tá pifando.
Eu consegui desenvolver uma solução onde eu ignoro uma porção inicial do dbf onde tem o header do dbf e formato os registros.
Aparentemente deu certo, mas em partes pois vejo dois problemas neste método que criei:

1) não tem como saber quais registros estavam excluidos.
2) Alguns ou vários registros pode desaparecer.

O que eu fiz foi ler o arquivo usando o fread e depois gravando os registros em um arquivo .txt e depois fiz um append from sdf.

Sobre este método que criei, o que vocês acham ou sugerem.

Obrigado,

Rossine.

Recuperar arquivo DBF danificado

Enviado: 15 Jul 2015 01:05
por rochinha
Amiguinhos,

O arquivo apresenta erro de corrupção por falta do .DBT/.FPT ou o .DBT/.FPT possa estar danificado.

Nestes caso uma cópia do .DBT/.FPT novo pode resolver.

Recrie em outro lugar o .DBF afetado de forma que o .DBT/.FPT novo seja criado e então copie o .DBT/.FPT novo para junto do .DBF danificado.

Outra forma de manipular um .DBF sem o arquivo memo poderia acontecer caso o bit que controla esta característica seja desligado.

DBF File structure

Quanto a registros deletados, deve haver um flag na estrutura do registro que indique este atributo. Ouvi a muito tempo atrás que tinha a ver com o caracter *(asterisco).

Em relação a sua rotina, coloque na sessão dicas, será muito util.

Recuperar arquivo DBF danificado

Enviado: 15 Jul 2015 01:27
por fladimir
Nunca tinha visto o antivirus detonar DBFs, q coisa hein, pq será q fez isso? (assunto pra sessão bate papo)

Fora isto o q vc fez, ao meu ver não poderia ser a solução definitiva, mas servir de base pra tentar em conjunto com as dicas do Rochinha tentar tipo transplantar os dados q vc recuperou para um DBF "saudável" de mesma estrutura.

Mas não sou expert no assunto, talvez outro colega possa contribuir.

[]´s

Recuperar arquivo DBF danificado

Enviado: 15 Jul 2015 01:32
por alxsts
Olá!

O OP informa que o DBF não possui campo memo.

Sei que já encontrou uma solução mas, se pelo menos consegue abrir o arquivo com USE, pode fazer uma leitura de início ao fim, dentro de um DO WHILE contendo uma estrutura BEGIN SEQUENCE... END SEQUENCE, gravando os registros em outro DBF de estrutura igual. Quando ocorresse um erro, no bloco RECOVER tentar recuperar pelo menos o Recno() do registro onde ocorreu o erro e ignorar o registro, dando SKIP e LOOP. Se quiser se aprofundar, veja DBF File structure

Recuperar arquivo DBF danificado

Enviado: 15 Jul 2015 10:09
por JoséQuintas
Eu tentei rodar o filefix.exe mas ele está em 16bits e estou usando o windows 7 em 32 bits.
Tá certo isso?
Cheguei a rodar aqui em Windows 7 32 bits.
Ele se perde um pouco ao carregar, quanto a localizar diretórios, e basta ESC/ignore, não lembro exatamente.
E se for um disco grande, ele também pode se perder pela limitação da época DOS.
A saída pra esta última ocorrência, talvez usar um pen drive que tem espaço em disco limitado.

Independente disso, o Windows 7 tem o download do XP Mode.
É tipo um VirtualPC que já vém com um XP pré-instalado.
Então teria um XP 32 bits dentro do Windows 7 64 bits - acho mais provável seu Windows ser este.

Recuperar arquivo DBF danificado

Enviado: 15 Jul 2015 12:11
por Pablo César
JoséQuintas escreveu:Tá certo isso?
Cheguei a rodar aqui em Windows 7 32 bits.
Ele se perde um pouco ao carregar, quanto a localizar diretórios, e basta ESC/ignore, não lembro exatamente.
Nossa passou por alto esse detalhe. Não deparei com o que o colega disse sobre o Windows en 32bits.
Eu ainda continuo usando e é como você disse JoséQuintas, ele até funciona se perde um pouco. Também experimentei em disquete e deve funcionar em pendrives também.

Recuperar arquivo DBF danificado

Enviado: 15 Jul 2015 16:31
por qatan

Recuperar arquivo DBF danificado

Enviado: 16 Jul 2015 15:03
por rossine
Olá Pessoal,

Primeiramente obrigado a todos que se manifestaram.

Sobre o filefix o que ocorreu foi uma mensagem que o administrador do windows me retornou falando da seguinte mensagem:

Código: Selecionar todos

16 bit MS-DOS SubSystem

Administrador: Prompt MS-DOS - filefix

An application has attempted directly access the hard disk which cannot be
supported. This may cause the application to function inccortly. Choose 'close'
to terminate the application.

                                FECHAR   IGNORAR
Aí eu escolhi a opção de FECHAR, mas depois que postei a mensagem no grupo, rodei novamente o filefix e escolhi a opção IGNORAR e ele rodou, mas os registros não foram recuperados corretamente. Ocorreu que ele a cada registro , saltava uma linha em branco e os dados não foram recuperados corretamente.

Em relação a minha solução, eu simplesmente li o arquivo como se fosse um .TXT através do fread/fseek/fwrite e gerei ele no padrao .TXT.

Para quem estiver interessado, veja o código abaixo:

Código: Selecionar todos

*************
function main( cFileBad, cFileGood, nTam, nSalto )
*************

local nCtd := 0, cBuffer, nLen, nHandle, nHandle2, cData, nPos

__DefaultNIL( @nTam, "" )
__DefaultNIL( @nSalto, "" )

cls
@0, 0 say "                          <<< Recuperador de DBF >>>                (Versao 1.0)"

if empty(nTam)
   ? ""
   ? "Modo de usar:"
   ? "recupdbf arq_estragado.dbf arq_bom.dbf nTamanho_registro nsalto_Inicial"
   ? ""
   ? "     Exemplo: recupdbf contas.dbf new.dbf 439 556"
   ? ""
   ? ""
   ? ""
   quit
endif

if !file( cFileBad )
   ? ""
   ? "O Arquivo que esta ESTRAGADO, nao existe..."
   ? ""
   ? ""
   ? ""
   quit
endif

if !file( cFileGood )
   ? ""
   ? "O Arquivo que esta BOM, nao existe..."
   ? ""
   ? ""
   ? ""
   quit
endif

nTam    := val(nTam)

if nTam <= 0
   ? ""
   ? "O <tamanho do registro> deve ser maior que ZERO..."
   ? ""
   ? ""
   ? ""
   quit
endif

nSalto  := val(nSalto)

if nSalto < 0
   ? ""
   ? "O <Salto inicial> deve ser igual ou maior que ZERO..."
   ? ""
   ? ""
   ? ""
   quit
endif

cBuffer := space(nTam)
nLen    := nTam
nHandle := FOpen(cFileBad)

if Ferror() = 0

    nHandle2 := fcreate( "recupdbf.txt", 0 )

    if FError() != 0
       ? "Erro ao criar o arquivo RECUPDBF.TXT...", FError()
       quit
    endif

    cData := ""

    if nSalto > 0
       fseek( nHandle, nSalto, 0 )
    endif

    nLen := FRead( nHandle, @cBuffer, nLen )

    @18,01 say "*** Iniciando leitura do arquivo..."

    @22, 01 say "[ESC] abortar"

    do while nLen > 0

       if inkey() = 27
          @22, 01 say "*** Importacao abortada pelo usuario..."
          exit
       endif

       nCtd += 1

       @19, 01 say "*** Lendo Bloco: " + hb_ntos(nCtd)

       if nLen < nTam
          cData := left( cBuffer, nLen )
       else
          cData := cBuffer
       endif

       cData += chr(13) + chr(10)

       fwrite( nHandle2, cData, len(cData) )

       nLen := FRead( nHandle, @cBuffer, nLen )

    enddo
      
    FClose( nHandle )

    FClose( nHandle2 )

    @19,01 say "*** Importando dados para o arquivo " + cFileGood + ". Aguarde..."

    use ( cFileGood ) exclusive
    zap
    append from "recupdbf.txt" sdf

    @20,01 say "*** Final de Importacao. Tecle ENTER..."
    inkey(0)

    go top
    browse()

    cls
    @20,01 say "*** Executando o comando PACK. Aguarde..."
    pack

    close  all

    @21, 01 say "*** Foi gerado o novo arquivo: " + cFileGood
else
    @21, 01 say "*** Nao consegui abrir o arquivo: " + cFileBad + " - Erro: " + hb_ntos(Ferror())
endif

return NIL

// EOF //

Esta foi a maneira de encontrei aqui para ler um DBF que o comando USE não conseguia abrí-lo e nem um outro programa.

ATENÇÃO: Os dados retornados tem que ser analisados com cuidado, pois pode-se perder, poucos ou vários registros e também aparecer registros duplicados ou deletados.

Ainda falta ver se tem como identificar se o registro está deletado e ignorá-lo neste caso.

Se alguém conseguir melhorar o código ou dar alguma dica, sinta-se a vontade.

T+

Rossine.