搞IT的人都会遇见的问题,特别是有用了公司的笔记本或台式机电脑,自己长期在上面保存了大量的信息文件,突然要换机器或离职移交时,除了要把数据备份,还有一个就是要彻底地删除原有数据。

一般的做法是格式化硬盘并重装系统。但格式化时,我们一般都不做低级格式化,而是快速格式化或普通格式化(即高级格式化)。我个人理解快速格式化是标识全部扇区均可用,普通格式化是会扫描一下每个扇区,但并不会重写,因此这两者都不会彻底清除数据,只是重写了FAT表,数据内容仍在,仍然可以用软件恢复。如果要彻底清除,则需要把所有扇区重写一次,全部写成0或其它随机值。

因此,比较安全的删除步骤如下:

1.格式化硬盘;

2.重装操作系统;

3.把所有扇区重写入一遍。

据说理论上要真正地防止恢复,需要反复往一个磁道扇区里写入随机数据,并至少写入6次以上,这样就连FBI都无法恢复了;否则的话,即使已经重写过数据,利用专门的设备,还是有办法读出磁盘中残留的磁信号,从而恢复出数据来的。

因此,有很多专门做彻底删除的软件出现,功能强大,使用也不简单。其实我们自己要做的话,只要往磁盘里面拷文件就行了,写文件的过程就会重写磁道扇区了。

当然了,一个个文件这样拷贝还是比较麻烦的,一边读一边写,速度也较慢。像我们这些搞编程的,其实自己写一个抹除程序也很容易,比如我就写过一个,抹除的速度很快。界面如下:

该程序已上传到这里:。

基本原理就是申请一大片内存,填入随机值,然后大块大块地写磁盘文件,基本上一分钟能抹掉几个G的空间。默认只写入一次。如果你觉得不够,可自行把生成的文件删除,然后再重新生成多几次。

GO按钮的代码如下:

procedure TfrmMain.btnGoClick(Sender: TObject); 

 

  var 

 

    FS: TFileStream; 

 

    I, J: Integer; 

 

    BufSize: Integer; 

 

    Buffer: PChar; 

 

    Sz, szMax, icheck: int64; 

 

    fn: string; 

 

  begin 

 

    I := 0; //初始化 

 

    icheck := 0; 

 

    BufSize := 1024 * StrToIntDef(edtBufferSize.Text, 1024); 

 

    szMax := 1024 * 1024 * StrToIntDef(edtFileSize.Text, 1024); 

 

    btnGo.Enabled := False; 

 

    btnCancel.Enabled := True; 

 

    FCanceled := False; 

 

    GetMem(Buffer, BufSize); //申请内存 

 

    try 

 

      while True do 

 

      begin 

 

        if ckbRandom.Checked then //随机填充 

 

        begin 

 

          Randomize; 

 

          for J := 1 to BufSize do 

 

            PChar(Buffer)[J] := Char(Random(256)); 

 

        end; 

 

        sz := 0; 

 

        repeat //获取一个可用的文件名 

 

          Inc(I); 

 

          fn := Format(edtFileName.Text, [I]); 

 

        until not FileExists(fn); 

 

        StatusBar1.SimpleText := 'Current file: ' + fn; 

 

        StatusBar1.Refresh; 

 

        FS := TFileStream.Create(fn, fmCreate); //创建文件并不断写入 

 

        try 

 

          while sz < szMax do 

 

          begin 

 

            FS.WriteBuffer(Buffer^, BufSize); 

 

            sz := sz + BufSize; 

 

            icheck := icheck + BufSize; 

 

            if icheck > 30 * 1024 * 1024 then //每写入30M则更新一下进度并检查中止 

 

            begin 

 

              icheck := 0; 

 

              StatusBar1.SimpleText := 'Current file: ' + fn + ' ' + FloatToStr(sz / 1024 / 1024) + 'MB'; 

 

              Application.ProcessMessages; 

 

              CheckAbort(' '); 

 

              if FCanceled then 

 

                Abort; 

 

            end; 

 

          end; 

 

        finally 

 

          FS.Free; 

 

        end; 

 

      end; 

 

    finally 

 

      FreeMem(Buffer, BufSize); 

 

      btnGo.Enabled := True; 

 

      btnCancel.Enabled := False; 

 

    end; 

 

  end;


 

总共不到100行代码,写入后找个文件来看一下内容:

可以看到,确实是填充了随机内容。虽然不是特别随机,也没有写够6次以上,但已经无法用软件恢复,对普通人来说已经足够安全了。