Unzap a um DBF

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

lapinha
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 29 Dez 2007 22:01
Localização: Portugal

Unzap a um DBF

Mensagem por lapinha »

Bem Hajam a todos os amigos do forum.

Eu quando era mais novo sei que havia um utilitário do norton utilities que fazia o unzap de um arquivo "zapado".

Quando se faz um zap ao arquivo pode-se recuperá-lo. Alguém me pode dar a dica onde encontro este utilitário.

Saudações amigas a todos

Carlos Lapa
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á

Mensagem por Pablo César »

lapinha escreveu:Bem Hajam a todos os amigos do forum.
Obrigado Carlos e muito própero ano novo para você e os seus !

Não creio colega, que encontres algum utilitário que dê para fazer UN-ZAP num arquivo DBF após de ter dado um ZAP no Clipper. Ao menos que antes tenha sido feito um arquivo backup. eu desconheço isso.
Editado pela última vez por Pablo César em 07 Jan 2008 22:35, em um total de 1 vez.
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
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á

Mensagem por Pablo César »

Como eu disse, em Clipper não creio que encontres algo. Mas pesquisando na NET encontrei o seguinte código feito em VP:

Código: Selecionar todos

FUNCTION UNZAP
PARAMETER Y
IF Y>0 .AND. USED() 
   IF RECCOUNT()=0
      FILENAME=DBF()
      USE
      HANDLE=FOPEN(FILENAME,2)
      IF HANDLE>0
         BYTE=FREAD(HANDLE,32)
         BKUP_BYTE=BYTE
         FIELD_SIZE=ASC(SUBSTR(BYTE,11,1))+(ASC(SUBSTR(BYTE,12,1))*256)
         FILE_SIZE=FSEEK(HANDLE,0,2)
         BYTE8=CHR(INT(Y/(256*256*256)))
         BYTE7=CHR(INT(Y/(256*256)))
         BYTE6=CHR(INT(Y/256))
         BYTE5=CHR(MOD(Y,256))
         BYTE=SUBSTR(BYTE,1,4)+BYTE5+BYTE6+BYTE7+BYTE8+SUBSTR(BYTE,9)
         =FSEEK(HANDLE,0)
         =FWRITE(HANDLE,BYTE)
         =FCHSIZE(HANDLE,FILE_SIZE+(FIELD_SIZE*Y))
         =FCLOSE(HANDLE)
      ENDIF
      USE &FILENAME
   ENDIF
ENDIF

Uso:
ZAP
=UNZAP(47)   && recupera 47 registros
Tentei reproduzir isto em puro Clipper, mas fico devendo porque não sei nada de VP. E esbarro na função FCHSIZE() que é caracteristico do VP, veja o que eu encontrei sobre esta função:

"http://msdn2.microsoft.com/en-us/librar ... S.80).aspx" (cole este link no seu navegador)
http://portal.dfpug.de/dfpug/Dokumente/ ... ChSize.doc

Pelo que tenho lido, após um ZAP se não houver ESCRITA ALGUMA no seu HD, existe alguma chance de recuperar o arquivo, pois quando é feito um ZAP este é criado um arquivo DBF sem registros com o mesmo nome e deletado o DBF original. agora se tiver algum colega que possa compilar este código em VP e testar, quem sabe possa disponibilizar o aplicativo para todos nós...
Editado pela última vez por Pablo César em 16 Abr 2008 12:21, em um total de 1 vez.
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
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á

Mensagem por Pablo César »

Outra possível solução é "Dsalvage Pro" mas não ´´e FREEWARE...

http://www.hallogram.com/dsalvge/
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
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Como eu disse, em Clipper não creio que encontres algo. Mas pesquisando na NET encontrei o seguinte código feito em VP:
Não sei com relação às diversas versões do Windows, mas em DOS, ao descartar uma porção de memória em disco (ZAP), o espaço desalocado não é utilizado de imediato por nenhum outro arquivo. É uma estratégia de alocação (configurável atrás de um serviço do DOS) que permite a recuperação de arquivos apagados.

Mas ao realocar espaço, mesmo que seja para o mesmo arquivo, o DOS não utiliza o espaço que acabou de ser descartado. Ele busca espaço numa área livre. O que foi descartado só seria reaproveitado se houvesse a recuperação de um arquivo apagado, o que não é o caso. Aqui se descarta parte do arquivo e faz-se uma nova alocação com a função fchsize do VFP que, provavelmente, é derivada da função chsize da API do Windows.

Esta função é como uma sanfona. Ela aumenta ou diminui o tamanho de um arquivo. É uma função fortemente ligada ao sistema operacional. Por isso, em C não é uma função aceita pelo padrão ANSI, por quê ela depende da implementação do SO.

Se fosse pra fazer algo que realmente funcionasse certinho, eu acho que o correto seria recorrer à tabela de alocação de arquivos pra recuperar a porção que foi descartada. Como isso iria requerer acesso em baixo nível, é fácil perceber que a coisa seria meio complicada.

Como eu já disse, não sei se isso funcionaria no Windows. A chave do sucesso está na função fchsize(). Ela é o coração deste recurso. Sinceramente, não consigo imaginar porque funcionaria, se ela apenas aloca ou desaloca espaço, usando um recurso simples do SO.

Mas é o caso de alguém testar e ver se dá mesmo. Nem precisaria ser em VFP. Poderia ser em outra linguagem qualquer que tenha acesso à essa função chave.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
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á

Mensagem por Pablo César »

Carlos, permita-me fazer uma perguntinha... em quê situação você precisa disso ? Isto é uma coisa que ocorreu agora acidentalmente e deseja recuperar (que acho dificil agora depois de tanto que se passou...) ou seria para alguma rotina de manutenção para arquivamento de dados ? Porque conforme for, acho que tem diversas formas de evitar o ZAP, ora porque no seria conveniente o uso desse comando quando está em rede. Isso claro, depende do tratamento e finalidade que se dê ao ZAP.
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
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Grande Lapinha! Como vai Silves??

Cara, se eu fosse você, desistia de tentar fazer a recuperação. Há uma série de programas que dizem fazer isso (recuperação de dados apagados), mas nenhum deles garante 100%. O que você talvez vai conseguir, depois de muito trabalho e algum custo, vão ser somente "fragmentos" de informações, que não vão valer muito.

Um caso real: há uns 2 meses, um colega nosso apagou sem querer a pasta onde estavam os seus programas e o backup deu erro. Bem, eu e mais uns 15 amigos montamos uma força-tarefa para o ajudar, levantamos (acho que) todos os programas de recuperação disponíveis, tentamos uma série de providências, mas o resultado foi quase zero: só conseguimos fragmentos dos arquivos deletados e, no fim, o tal colega acabou tendo que refazer todos os programas...

No tempo do DOS e PCTools a coisa era mais fácil, eu mesmo recuperei muita coisa com o Norton. Mas sob o Windows? Eu nem tento. Aliás, não estou dizendo pra você não tentar! Se as informações são vitais para você, talvez valha a pena. Mas não espere muito.

Grande abraço, meu amigo.
Avatar do usuário
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem por Augusto »

Pessoal... confesso que lí muito rapidamente os posts acima mas, pelo que eu entendi o que o colega quer é recuperar "registros" de um DBF que sofreu um ZAP e não recuperar um arquivo DBF deletado do HD ou pasta... logo as supostas soluções apresentadas, com exceção do código em VP disponibilizado pelo Pablo foram equivocadas...

Me perdoem se eu estiver errado...

Por outro lado, até onde eu saiba, não há como recuperar "registros" após o zap....
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

O software dSalvage, indicado pelo Pablo, promete justamente recuperar registros de um arquivo que sofreu um ZAP. Só que não há versão demo e ele custa US$245, sem qualquer chance de reembolso caso o programa não cumpra o que promete. Não me soa muito bem, apesar de que o programa também se preste a outros serviços de manutenção.

Mas, enfim, no meu post tentei entender como isso poderia ser feito. Não creio que seja possível. Só testando o código VFP postado pelo Pablo ou convertendo-o pra C ou mesmo XHarbour, já que a função "chave" do programa existe na API do Windows.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinhos

O conjunto de funções de baixo nivel Fblablabla não possui uma função FSIZE()?
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
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á

Mensagem por Pablo César »

Não em Clipper, Rochinha. E a função em questão é fchsize() e que eu saiba não existe pois não está documentada e acusa falta dela na compilação. Você tem VFP para testar esse código que eu postei ? (ou terei que esperar um tempão... hihih isso é uma brincadeirinha por causa do outro tópico sobre o MERGE) mas sei que você está muito ocupado e também não é obrigado a estar me atendendo... não é ?. Mas seria bom alguém que tenha Visual FoxPro que compilassem e dessem uma opinião (ja pedí para outros colegas que sei que tem, mas ainda não leram o meu MP).
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
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Na relação de funções de baixo (mais baixo) nível para tratamento de arquivos no Clipper, não contém qualquer função de ajuste de tamanho de arquivo. FSize() não existe na biblioteca padrão do Clipper. Mas seria apenas para obter o tamanho do arquivo, a julgar pelo nome. Aliás, nem precisa existir, já que se pode usar FileSeek(<handle>,0,FS_END), que produz o mesmo efeito.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
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á

Mensagem por Pablo César »

Ok Maligno se a função FileSeek(<handle>,0,FS_END) aparentemente faria o mesmo. A questão não afetaria o disposicionamento do ponteiro nesse exemplo que postei ?. Na verdade, não boto muita fé nesse código, não creio que ampliando o tamanho do atual zapado com simplesmente mudar o ponteiro... será ?
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
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Não. Veja bem: eu disse que esse uso de FileSeek() faria o mesmo que um FSize(), que o Clipper não tem. Foi apenas um comentário sobre o que o Rochinha falou.

A questão do conteúdo ser recuperado apenas com o aumento do arquivo (é a única coisa que chSize() faz) ainda é uma incógnita. Ninguém testou.

Uma crítica construtiva: não use ou relacione o termo ponteiro com o tamanho de um arquivo. Ponteiro serve apenas para indicar uma determinada posição de memória ou, conforme o nosso caso aqui, onde ocorrerá o próximo acesso a um arquivo (é a finalidade da FSeek(), que muda o ponteiro do arquivo).
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
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á

Mensagem por Pablo César »

Maligno escreveu:Uma crítica construtiva: não use ou relacione o termo ponteiro com o tamanho de um arquivo.
Mas absolutamente que não, não foi isso que eu disse. justamente para "ampliar" o tamanho do arquivo ZAPado, teria que disposicionar o ponteiro também. Não achas que é assim ?. Me refiro nesse exemplo que postei (em VFP).
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.
Responder