Recuperar arquivo DBF danificado

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Recuperar arquivo DBF danificado

Mensagem 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.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Recuperar arquivo DBF danificado

Mensagem 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.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Recuperar arquivo DBF danificado

Mensagem 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
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Recuperar arquivo DBF danificado

Mensagem 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.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Recuperar arquivo DBF danificado

Mensagem por Pablo César »

Lamentavelmente não. Tente numa maq antiga ou utilize um emulador.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Recuperar arquivo DBF danificado

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Recuperar arquivo DBF danificado

Mensagem 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
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Recuperar arquivo DBF danificado

Mensagem 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.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Recuperar arquivo DBF danificado

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Recuperar arquivo DBF danificado

Mensagem 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
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Recuperar arquivo DBF danificado

Mensagem 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
[]´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

Recuperar arquivo DBF danificado

Mensagem 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.
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
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Recuperar arquivo DBF danificado

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
qatan
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 07 Fev 2014 06:37
Localização: France

Recuperar arquivo DBF danificado

Mensagem por qatan »

Qatan
Harbour
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Recuperar arquivo DBF danificado

Mensagem 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.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Responder