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;