Performs a copy, move, rename, or delete operation on a file system object. WINSHELLAPI int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp); Parameters lpFileOp:Pointer to an SHFILEOPSTRUCT structure that contains information the function needs to carry out the operation.Return Values Returns zero if successful or nonzero if an error occurs. Now Supported on Windows NT
这是完整的文件夹复制方法,看看吧:procedure TForm1.CopyBtnClick(Sender: TObject); var opstruc:tshfileopstruct; frombuf,tobuf:array[0.128]of char; begin fillchar(frombuf,sizeof(frombuf),0); fillchar(tobuf,sizeof(tobuf),0); strpcopy(frombuf,pchar(edit1.Text));//源目录 strpcopy(tobuf,pchar(edit2.Text));//目的目录 //填充opstruc记录 with opstruc do begin wnd:=handle; wfunc:=fo_copy; pfrom:=@frombuf; pto:=@tobuf; fflags:=fof_noconfirmation or fof_renameoncollision; fanyoperationsaborted:=false; hnamemappings:=nil; lpszprogresstitle:=nil; end; //开始复制 if shfileoperation(opstruc)=0 then messagebox(handle,'复制完毕.','复制信息',mb_ok+mb_iconinformation);end;------------------------------ 风过西窗客渡舟船无觅处 年年一川新草遥看却似旧
SHFileOperation()可实现Window一样的效果,支持回收站!~
Parameters
lpFileOp:Pointer to an SHFILEOPSTRUCT structure that contains information the function needs to carry out the operation.Return Values
Returns zero if successful or nonzero if an error occurs. Now Supported on Windows NT
var
opstruc:tshfileopstruct;
frombuf,tobuf:array[0.128]of char;
begin
fillchar(frombuf,sizeof(frombuf),0);
fillchar(tobuf,sizeof(tobuf),0);
strpcopy(frombuf,pchar(edit1.Text));//源目录
strpcopy(tobuf,pchar(edit2.Text));//目的目录
//填充opstruc记录
with opstruc do
begin
wnd:=handle;
wfunc:=fo_copy;
pfrom:=@frombuf;
pto:=@tobuf;
fflags:=fof_noconfirmation or fof_renameoncollision;
fanyoperationsaborted:=false;
hnamemappings:=nil;
lpszprogresstitle:=nil;
end;
//开始复制
if shfileoperation(opstruc)=0 then
messagebox(handle,'复制完毕.','复制信息',mb_ok+mb_iconinformation);end;------------------------------
风过西窗客渡舟船无觅处
年年一川新草遥看却似旧
------------------------------
风过西窗客渡舟船无觅处
年年一川新草遥看却似旧
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;type
TMainForm = class(TForm)
GroupBox1: TGroupBox;
spbtnGetFromDir: TSpeedButton;
spbtnGetToDir: TSpeedButton;
edtFromDir: TEdit;
edtToDir: TEdit;
Button1: TButton;
GroupBox2: TGroupBox;
edtRecycleDir: TEdit;
spbtnRecycleBin: TSpeedButton;
btnRecycleDir: TButton;
btnClose: TButton;
procedure spbtnGetFromDirClick(Sender: TObject);
procedure spbtnGetToDirClick(Sender: TObject);
procedure btnCopyDirectoryClick(Sender: TObject);
procedure spbtnRecycleBinClick(Sender: TObject);
procedure btnRecycleDirClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;implementation
uses ShellAPI, FileCtrl;
{$R *.DFM}function GetDirectory: String;
begin
if not SelectDirectory(Result, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
Result := EmptyStr;
end;procedure CopyDirectoryTree(AHandle: THandle; const AFromDirectory, AToDirectory: String);
var
SHFileOpStruct: TSHFileOpStruct;
FromDir: PChar;
ToDir: PChar;
begin GetMem(FromDir, Length(AFromDirectory)+2);
try
GetMem(ToDir, Length(AToDirectory)+2);
try FillChar(FromDir^, Length(AFromDirectory)+2, 0);
FillChar(ToDir^, Length(AToDirectory)+2, 0); StrCopy(FromDir, PChar(AFromDirectory));
StrCopy(ToDir, PChar(AToDirectory)); with SHFileOpStruct do
begin
Wnd := AHandle; // Assign the window handle
wFunc := FO_COPY; // Specify a file copy
pFrom := FromDir;
pTo := ToDir;
fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
if SHFileOperation(SHFileOpStruct) <> 0 then
RaiseLastWin32Error;
end;
finally
FreeMem(ToDir, Length(AToDirectory)+2);
end;
finally
FreeMem(FromDir, Length(AFromDirectory)+2);
end;
end;procedure ToRecycle(AHandle: THandle; const ADirName: String);
var
SHFileOpStruct: TSHFileOpStruct;
DirName: PChar;
BufferSize: Cardinal;
begin
BufferSize := Length(ADirName) +1 +1;
GetMem(DirName, BufferSize);
try
FillChar(DirName^, BufferSize, 0);
StrCopy(DirName, PChar(ADirName)); with SHFileOpStruct do
begin
Wnd := AHandle;
wFunc := FO_DELETE;
pFrom := DirName;
pTo := nil;
fFlags := FOF_ALLOWUNDO; fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end; if SHFileOperation(SHFileOpStruct) <> 0 then
RaiseLastWin32Error;
finally
FreeMem(DirName, BufferSize);
end;
end;procedure TMainForm.spbtnGetFromDirClick(Sender: TObject);
begin
edtFromDir.Text := GetDirectory;
end;procedure TMainForm.spbtnGetToDirClick(Sender: TObject);
begin
edtToDir.Text := GetDirectory;
end;procedure TMainForm.btnCopyDirectoryClick(Sender: TObject);
begin
CopyDirectoryTree(Handle, edtFromDir.Text, edtToDir.Text);
end;procedure TMainForm.spbtnRecycleBinClick(Sender: TObject);
begin
edtRecycleDir.Text := GetDirectory;
end;procedure TMainForm.btnRecycleDirClick(Sender: TObject);
begin
ToRecycle(0, edtRecycleDir.Text);
end;procedure TMainForm.btnCloseClick(Sender: TObject);
begin
Close;
end;end.
Left = 271
Top = 107
Width = 696
Height = 358
Caption = 'Form6'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object GroupBox1: TGroupBox
Left = 20
Top = 20
Width = 637
Height = 125
Caption = ' Copy directory example '
TabOrder = 0
object spbtnGetFromDir: TSpeedButton
Left = 590
Top = 20
Width = 23
Height = 22
Caption = '...'
end
object spbtnGetToDir: TSpeedButton
Left = 590
Top = 52
Width = 23
Height = 22
Caption = '...'
end
object edtFromDir: TEdit
Left = 40
Top = 20
Width = 553
Height = 21
TabOrder = 0
end
object edtToDir: TEdit
Left = 40
Top = 52
Width = 553
Height = 21
TabOrder = 1
end
object Button1: TButton
Left = 44
Top = 84
Width = 157
Height = 25
Caption = 'Copy Directory'
TabOrder = 2
end
end
object GroupBox2: TGroupBox
Left = 20
Top = 156
Width = 637
Height = 133
Caption = ' To recycle bin example '
TabOrder = 1
object spbtnRecycleBin: TSpeedButton
Left = 590
Top = 20
Width = 23
Height = 22
Caption = '...'
end
object edtRecycleDir: TEdit
Left = 40
Top = 20
Width = 553
Height = 21
TabOrder = 0
end
object btnRecycleDir: TButton
Left = 44
Top = 56
Width = 157
Height = 25
Caption = 'Delete Directory'
TabOrder = 1
end
end
object btnClose: TButton
Left = 312
Top = 296
Width = 75
Height = 25
Caption = 'Close'
TabOrder = 2
end
end