How can I delete a file to the Recycle Bin?

From: "Ed Lagerburg" <lagerbrg@euronet.nl>

 


program del;

 

uses

 ShellApi;

 

//function SHFileOperation(const lpFileOp: TSHFileOpStruct): Integer; stdcall;

 

Var T:TSHFileOpStruct;

    P:String;

begin

  P:='C:\Windows\System\EL_CONTROL.CPL';

  With T do

  Begin

    Wnd:=0;

    wFunc:=FO_DELETE;

    pFrom:=Pchar(P);

    fFlags:=FOF_ALLOWUNDO

  End;

  SHFileOperation(T);

End.

 

 

From: bstowers@pobox.com (Brad Stowers)

There are some other quirks you should be aware of, too:

·        Give the complete file path for every file specified. Do not rely on the current directory, even if you change to it right before the call. The SHFileOperation API is not "smart" enough to use the current directory if one is not given for undo information. So, even if you give the FOF_ALLOWUNDO flag, it will not move deleted files to the recycle bin because it doesn't know what path they came from, and thus couldn't restore them to their original location from the recycle bin. It will simply delete the file from the current directory.

·        MS has a documentation correction about the pFrom member. It says that for multiple files, each filename is seperated by a NULL (#0) character, and the whole thing is terminated by double NULLs. You need the double NULL whether or not you are passing multiple filenames. Sometimes it will work correctly without them, but often not. That's because sometimes you get lucky and the memory following the end of your string has a NULL there.

An example of how to do this would be:

var

  FileList: string;

  FOS: TShFileOpStruct;

begin

  FileList := 'c:\delete.me'#0'c:\windows\temp.$$$'#0#0;

  { if you were using filenames in string variables: }

  FileList := Filename1 + #0 + Filename2 + #0#0;

 

  FOS.pFrom := PChar(FileList);

 

  // blah blah blah

end;

 

other

 

Delete a file to the RecycleBin

If you want to delete a file to the RecycleBin, you can use SHFileOperation procedure with SHFileOpStruct structure.

For example, you can do so:

 

 

uses ShellAPI;

 

procedure TForm1.Button1Click(Sender: TObject);

var

  MyFileStruct: TSHFileOpStruct;

begin

  with MyFileStruct do

  begin

    Wnd:=Form1.Handle;

    wFunc:=FO_DELETE;

    pFrom:=PChar(Edit1.Text);

    fFlags:=FOF_ALLOWUNDO;

  end;

  try

    SHFileOperation(MyFileStruct);

  except

    on EAccessViolation do Edit1.Text:='';

  end;

end;