Página 1 de 3
Unzap a um DBF
Enviado: 07 Jan 2008 21:24
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
Enviado: 07 Jan 2008 21:28
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.
Enviado: 07 Jan 2008 22:03
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...
Enviado: 07 Jan 2008 22:21
por Pablo César
Outra possível solução é "Dsalvage Pro" mas não ´´e FREEWARE...
http://www.hallogram.com/dsalvge/
Enviado: 08 Jan 2008 04:07
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.
Enviado: 08 Jan 2008 09:05
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.
Enviado: 08 Jan 2008 09:45
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.
Enviado: 08 Jan 2008 14:57
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....
Enviado: 08 Jan 2008 15:07
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.
Enviado: 09 Jan 2008 11:41
por rochinha
Amiguinhos
O conjunto de funções de baixo nivel Fblablabla não possui uma função FSIZE()?
Enviado: 09 Jan 2008 11:47
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).
Enviado: 09 Jan 2008 11:52
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.
Enviado: 09 Jan 2008 11:57
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á ?
Enviado: 09 Jan 2008 12:10
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).
Enviado: 09 Jan 2008 12:21
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).