如何用编程的方法彻底删除文件(100分)

  • 主题发起人 主题发起人 mycwcgr_new
  • 开始时间 开始时间
M

mycwcgr_new

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用编程的方法彻底删除文件?
据说此文件要被覆盖三次以上
 
DeleteFile不可以吗???
 
以读写方式打开文件,写入随机数据
然后关闭文件,调用DeleteFile
 
what's meaning
 
同意LiChaoHui,先清零,再删除
 
打开文件,写若干个0在里面,然后deletefile,我这样做过。
 
ndch, 为什么这么做,这么做的用意是什么?请指教
 
这是因为,一般的删除文件,只是删除文件在磁盘上的入口,
文件的内容在刚刚删除后是保留完好的,
这也是一些恢复工具能够恢复删除后的文件的原因,
如果先破坏文件的数据,以读写的方式打开(注意,不要截断),写入乱序数据,
再删除,那么什么恢复工具都没用了
 
國際標準的徹底文件刪除法:
以二進制打開文件:全部寫0!
關閉!
然後以二進制打開文件:全部寫1
如些三次!
再寫入隨機的值!
哈哈!
就算神仙也沒有辦法救了:)
 
to jy_17
您能给一个例子吗?
需要考虑文件正被用户使用的情况?
 
这个函数是我的一个程序用到的一部分:
function XDelFile(const filename: string): Boolean;
var
f: file of byte;
n: byte;
i, io: integer;
begin
if FileExists(filename) then
begin
Result := True;
Randomize;
AssignFile(f, filename);
{$I-}
ReWrite(f);
io := IOResult;
{$I+}
CloseFile(f);
if io = 0 then
begin
//第一次,全部写 0
AssignFile(f, filename);
ReWrite(f);
n := 0;
for i := 1 to FileSize(f) do
begin
BlockWrite(f, n, 1);
end;
CloseFile(f);
//第二次,全部写 1
AssignFile(f, filename);
ReWrite(f);
n := 1;
for i := 1 to FileSize(f) do
begin
BlockWrite(f, n, 1);
end;
CloseFile(f);
//的三次,随机写
AssignFile(f, filename);
ReWrite(f);
for i := 1 to FileSize(f) do
begin
n := Random(2);
BlockWrite(f, n, 1);
end;
CloseFile(f);
end
else
Result := False;
//最后,删除
Result := Result and DeleteFile(filename);
end
else
Result := False;
end;
 
我写了一个多现成的程序,写自己定义的次数不同的数据,呵呵,这样山掉最册地
 
从文件系统对硬件I/O访问的角度来看,要实现你这种要求,
只能通过绝对硬盘读写。
因为利用文件系统提供的I/O函数,就算你做个N次操作,也不能保证关闭句柄时,
文件会写在原来的那个磁道、柱面、扇区,
如果有更合适的(例如更靠前,更合适存放文件大小的空闲区),
它就会搬到那个地方去。
原来的就仅仅是标记成未使用。那就有可能被一些工具软件恢复。
有效的办法是,先搜索该文件占用了哪一些扇区,
然后删除文件,再往这些扇区写零,
一次也就够了,不用太多次:)
 
To beta,
您的方法似乎有问题,我注释了下面一句
//Result := Result and DeleteFile(filename);
当我执行XDelFile('c:/1.txt')后,发现1.txt中并没有全部写0,文件是空白的,
我想当程序执行ReWrite语句时,就已将文件删除了(仅仅是删除了文件的分区表记录)

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function XDelFile(const filename: string): Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
function TForm1.XDelFile(const filename: string): Boolean;
var
f: file of byte;
n: byte;
i, io: integer;
begin
if FileExists(filename) then
begin

AssignFile(f, filename);
{$I-}
ReWrite(f);
io := IOResult;
{$I+}
CloseFile(f);
if io = 0 then
begin
//第一次,全部写 0
AssignFile(f, filename);
ReWrite(f);
n := 0;
for i := 1 to FileSize(f) do
begin
BlockWrite(f, n, 1);
end;
CloseFile(f);
result:=true;
end
else
begin
Result := False;
end;

//最后,删除文件,无论是否已经安全的填充了字符
//Result := Result and DeleteFile(filename);
end
else
begin
Result := False;
end;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if self.XDelFile(edit1.text) then
showmessage('Success');;
end;

end.
 
你修改了文件的内容,用任意数据填充,
即使恢复以后也只是被修改了的文件这和完全删除有什么区别了?
 
看来没人同意我的观点,呵呵。
 
{
If you want to get rid of a file normally you just delete it.
But someone else
can undelete it if the file hasn't been wiped correctly.
For security purposes, to insure that certain files are permanently
gone, the WipeFile procedure writes over the data in the file with
random characters and then
erases it.
Wenn man eine Datei nicht mehr braucht, löscht man sie einfach.
Aber jemand anders kann die Datei wieder herstellen, wenn sie
nicht "richtig" gelöscht wurde.
Aus Sicherheitsgründen, um sicherzustellen, dass eine Datei permanent
gelöscht wird, überschreibt die WipeFile Prozedur eine Datei mit
Zufalls-Zeichen und löscht sie anschliessend.

}
procedure WipeFile(FileName: string);
var
buffer: array [0..4095] of Byte;
max, n: LongInt;
i: Integer;
fs: TFileStream;

procedure RandomizeBuffer;
var
i: Integer;
begin

for i := Low(buffer) to High(buffer) do

buffer := Random(256);
end;

begin

fs := TFilestream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
try
for i := 1 to 3 do

begin

RandomizeBuffer;
max := fs.Size;
fs.Position := 0;
while max <> 0 do

begin

if max <> SizeOf(buffer) then

n := SizeOf(buffer)
else

n := max;
fs.Write(Buffer, n);
max := max - n;
end;

FlushFileBuffers(fs.Handle);
end;

finally
fs.Free;
end;

Deletefile(FileName);
end
 
To duducat,
您的程序算法有问题,当我删除一个小于1K的文件时,程序死循环
 
那你把 ReWrite 改成 ReSet 试试?
 
To beta,
结果一样,不行!
 
后退
顶部