Solved

Delete a file

Posted on 1998-09-10
10
165 Views
Last Modified: 2010-04-06
Hello.

I want to program to delete a file that can't undelete again like a shredder machine.
Please teach me a code or a website where I can download such a component.

Sakya
0
Comment
Question by:sakya
  • 4
  • 2
  • 2
  • +2
10 Comments
 

Author Comment

by:sakya
ID: 1339350
Edited text of question
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339351
Here is an example.////

DeleteFile('C:\windows\desktop\something.txt');

Regards,
Viktor Ivanov
0
 
LVL 2

Expert Comment

by:kjteng
ID: 1339352
All deleted file may be recovered if you know how to crack it. so the question is how secure do you want it to be ?
0
 
LVL 4

Expert Comment

by:erajoj
ID: 1339353
Hi,
This is not an easy question.
To be able to "shred" a file in order to not be able to read it afterwards is a tough one. DeleteFile will only remove/hide the allocation table entry and not really shred/wipe the data.
To wipe a file, you will have to replace it's sectors data with patterns or pseudorandom data.
Here's an example on how to do it. Do NOT trust this code, since it is not properly tested. The problems are:
1. If you modify the file, does the OS move the data physically so that the old data resides, unchanged, in it's old position?
2. If you shred the data and delete the file afterwards, do you know if the new data is physically changed on the disk or are the changes just made in the cache?

Anyway, here's something that MIGHT work. You can select pattern or pseudorandom shredding and number of passes:


function ShredFile( sFilename: string; cPasses: Integer; bPR, bDelete: Boolean ): Boolean;
type
  PBuf = ^TBuf;
  TBuf = array[ 0..0 ] of Byte;
const
  BLOCKSIZE = 65536;
  PATTERN: array[0..3] of Byte = ( $A, $A, $5, $5 );
var
  fs              : TFileStream;
  iIndex,
  iBytesToWrite,
  iBytesWritten,
  iBufSize        : Integer;
  p               : PBuf;
begin
  Result := False;
  p      := nil;
  try
    if FileExists( sFilename ) then begin
      fs := TFileStream.Create( sFilename, fmOpenReadWrite or fmShareExclusive );
      if fs.Size < BLOCKSIZE
      then iBufSize := fs.Size
      else iBufSize := BLOCKSIZE;
      try
        GetMem( p, iBufSize );
        if not bPR then begin
          for iIndex := 0 to iBufSize - 1 do begin
            p^[ iIndex ] := PATTERN[ iIndex and 3 ];
          end;
        end else Randomize; // initiate pseudorandom series
        while cPasses > 0 do begin
          fs.Seek( 0, soFromBeginning ); // always from the beginning
          repeat
            if bPR then for iIndex := 0 to iBufSize - 1 do p^[ iIndex ] := Random( 255 );
            if ( fs.Size - fs.Position ) <= BLOCKSIZE
            then iBytesToWrite := fs.Size - fs.Position
            else iBytesToWrite := BLOCKSIZE;
            iBytesWritten := fs.Write( p^, iBytesToWrite ); // speeds up things
          until ( iBytesToWrite < BLOCKSIZE ) or ( iBytesWritten <> iBytesToWrite );
          if iBytesWritten <> iBytesToWrite then begin
            Result := False;
            raise Exception.Create( 'Unable to write sufficient #bytes to file' );
          end;
          Dec( cPasses );
        end;
        fs.Free;
        if bDelete then Result := DeleteFile( sFilename );
      finally
        FreeMem( p );
        fs.Free;
      end;
    end;
  except end;
end;

Usage:

ShredFile( 'c:\mysecret.dat', 255, True, False ); // 255 passes, pseudorandom, keep file
ShredFile( 'c:\mysecret.dat', 1, False, True ); // 1 pass, pattern, delete file
ShredFile( 'c:\mysecret.dat', 0, False, True ); // just delete file

/// John

0
 

Author Comment

by:sakya
ID: 1339354
Thanks.

Yes. This is security problem.
erojoj is right.
'DeleteFile' just deletes the allocation table.
If it's a text type file, it will be restored.  
Now I am testing erojoj's code.

Sakya

Sakya


0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:sakya
ID: 1339355
Hello.

The erojoj's code works on windows95.
But I don't test it on OSR2 or NT.
I've heard Shredder code is different between win95 ver.1 and OSR2 before.

Anyway thanks.

I want to give my points to erojoj's excellent code.

Sakya


0
 
LVL 7

Accepted Solution

by:
Motaz earned 50 total points
ID: 1339356
This is an easy code, you can understand it after testing :

function KillFile(FileName:string):boolean;
var
    f:file;
    Buf:array [0..1023] of byte;
    i:integer;
begin
  for i:=0 to SizeOf(Buf)-1 do
   Buf[i]:=0;

 try
  AssignFile(f,FileName);
   FileMode:=2;   // Read and write access
   Reset(f);
   while not eof(f) do
     BlockWrite(f,Buf,SizeOf(Buf));
   CloseFile(f);
   Erase(f);
  except
  on e:exception do
  begin
    Result:=false;
    exit;
  end; // except
 end; // try
 Result:=true; // File successfully deleted
end;

Motaz form Sudan
motaz1@yahooo.com
0
 

Author Comment

by:sakya
ID: 1339357
Thanks

Sakya

0
 
LVL 4

Expert Comment

by:erajoj
ID: 1339358
Thanks Motaz.
My comments fade to oblivion in the shine of your excellent answers.

/// John
0
 
LVL 7

Expert Comment

by:Motaz
ID: 1339359
Thanks John

Motaz.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
my delphi exe application have  problem with windows explorer ! 12 80
Best Firemonkey component pack 1 86
error 1.1 400 Bad request idhttp delphi 18 54
select query - oracle 16 92
The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Migrating to Microsoft Office 365 is becoming increasingly popular for organizations both large and small. If you have made the leap to Microsoft’s cloud platform, you know that you will need to create a corporate email signature for your Office 365…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, just open a new email message. In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…

912 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now