如何彻底删除文件? (200分)

  • 主题发起人 主题发起人 icic_icic
  • 开始时间 开始时间
I

icic_icic

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我要删除文件 d:/abc.doc<br>一般想到是用API函数 DeleteFile(FileName:Pchar) <br>所以在我的程序里写的是<br>&nbsp;DeleteFile(Pchar('d:/abc.doc'));<br>但是删除成功后,有个朋友说,我可以恢复你删除的那个文件。于是他使用<br>了一个叫EasyRecovery的软件,成功地让abc.doc重新出现在硬盘上。大家不妨<br>也来试一试这个软件,下载地址:<br>http://schttp.skycn.net/down/fo-erp6.zip<br>我想让别人无法恢复删除的文件,有什么办法能够彻底地删除呢?<br>
 
先写入全0再删除,这样恢复了也没用
 
是啊,原理就是就打開你要刪除的文件,然後向裡面亂寫一些東西,再刪除。
 
我的想法是让他连文件也找不到。
 
你可以这样,打开文件,写满#0,关闭文件,将文件名改为一个随机数,然后删除……<br>我让你恢复,我让你恢复……[:D]
 
不知道能否先改名再刪除呢?改成一個很不規範名稱,再刪除看看?試過沒有?
 
还是能找到文件呀?[^]
 
这个和程序无关!deletefile就已经删除了!<br>EasyRecovery也不是是所有的删除文件都可以恢复,要求原来放文件的磁道没有被新的文件覆盖才能还原回来,这和操作系统有关系!所以你可以不理会这个!有本事你让它还原你的数据库记录试试!<br><br>可以想象一下,为什么我们 删文件 比 copy文件 快呢?因为删文件只要改FAT32的头目录中对应的地址去掉就可以了!而不需要实际去写原来文件的每一个bit!
 
那我删除掉文件后,必须要写入东东,才能彻底让人找不到我的文件?
 
不仅仅是写入<br>而是要覆盖你以前文件所使用的区域<br>这样才不可恢复
 
参考FileWiper……有源码的!<br>
 
刚刚在阿榕软件网找到一个软件:文件粉碎机<br>http://61.155.234.70/arongsoft/soft/332.htm<br>注册码<br>Name: Team TSZ<br>s/n: 42I2Z4Z444HPHF4<br>下载地址<br>http://sd-http.skycn.net/down/fpsetup.exe<br>介绍里面说:文件粉碎机采用的技术不是普通软件普遍采用的“数据填充”来彻底删除数据,而是采用自己的删除引擎。<br>现在知道了,“数据填充”是一种切实可行的办法,但是这个软件却不是这采用的这种方式。<br>所以我怀疑,用来删除文件或目录,Win32API里还有其它的函数,谁有一点印象吗?
 
但你无法保证写入的内容刚好覆盖到删除的文件以前所在的磁盘扇区。<br>查查看汇编能否实现写指定的磁盘扇区!
 
用个空文件覆盖再删除
 
找到了FileWiper的主页,在这个页面<br>http://www.ancort.ru/English/download.htm<br>可惜没有源码,是个俄国人写的软件
 
procedure WipeFile(FileName: string);<br>var<br>&nbsp; buffer: array[0..4095] of Byte;<br>&nbsp; max,n: LongInt;<br>&nbsp; i: integer;<br>&nbsp; fs: TFileStream;<br>&nbsp; procedure RandomizeBuffer;<br>&nbsp; var<br>&nbsp; &nbsp; i: integer;<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; for i:=Low(buffer) to High(buffer) do<br>&nbsp; &nbsp; &nbsp; &nbsp; buffer:=Random(256);<br>&nbsp; &nbsp; end;<br>begin<br>&nbsp; fs:=TFileStream.Create(FileName,fmOpenReadWrite or fmShareExclusive);<br>&nbsp; try<br>&nbsp; &nbsp; for i:=1 to 3 do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; RandomizeBuffer;<br>&nbsp; &nbsp; &nbsp; max:=fs.Size;<br>&nbsp; &nbsp; &nbsp; fs.Position:=0;<br>&nbsp; &nbsp; &nbsp; while max=0 do<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; if max=sizeof(buffer) then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n:=sizeof(buffer)<br>&nbsp; &nbsp; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n:=max;<br>&nbsp; &nbsp; &nbsp; &nbsp; fs.Write(buffer,n);<br>&nbsp; &nbsp; &nbsp; &nbsp; max:=max-n;<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; FlushFileBuffers(fs.Handle);<br>&nbsp; &nbsp; end;<br>&nbsp; finally<br>&nbsp; &nbsp; fs.Free;<br>&nbsp; end;<br>&nbsp; Deletefile(FileName);<br>end;
 
FlushFileBuffer??
 
在改正了一些小错误后,艾伦希亚的程序我已经试过了,比如d:/123.txt,<br>用这段程序删除后,再使用EasyRecovery可以100%的还原。
 
to :icic_icic &amp;艾伦希亚<br>FlushFileBuffer &nbsp;在那個單元里unit
 
不是FlushFileBuffer而是FlushFileBuffers;<br>还有中间一处fx也改成了fs<br>下面是我改好的程序,已经实现了将文件内容清空的功能,但是还是能用EasyRecovery恢复出文件名来。<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, StdCtrls;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; Edit1: TEdit;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure WipeFile(FileName: string);<br><br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; &nbsp;wipefile(edit1.Text);<br>end;<br><br>procedure TForm1.WipeFile(FileName: string);<br>var<br>&nbsp; &nbsp;max,n: LongInt;<br>&nbsp; &nbsp;i: integer;<br>&nbsp; &nbsp;fs: TFileStream;<br>&nbsp; &nbsp;buffer: array[0..4095] of char;<br>begin<br>&nbsp; &nbsp;for i:=Low(buffer) to High(buffer) do buffer:=#0;<br>&nbsp; &nbsp;fs:=TFileStream.Create(FileName,fmOpenReadWrite or fmShareExclusive);<br>&nbsp; &nbsp;try<br>&nbsp; &nbsp; &nbsp;n:=4096; &nbsp; <br>&nbsp; &nbsp; &nbsp;max:=fs.Size;<br>&nbsp; &nbsp; &nbsp;fs.Position:=0;<br>&nbsp; &nbsp; &nbsp;while max&gt;0 do<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp;if max&lt;n then n:=max;<br>&nbsp; &nbsp; &nbsp; &nbsp;fs.Write(buffer,n);<br>&nbsp; &nbsp; &nbsp; &nbsp;max:=max-n;<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp; &nbsp;FlushFileBuffers(fs.Handle);<br>&nbsp; &nbsp;finally<br>&nbsp; &nbsp; &nbsp;fs.Free;<br>&nbsp; &nbsp;end;<br>&nbsp; &nbsp;Deletefile(FileName);<br>end;<br><br>end.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部