Function CopyFileDirTo(aHandle: Integer;FileSoureDir,FileDestDir: String):Boolean; var OPStruct : TSHFileOpStruct; FromBuf,ToBuf : Array[0..128] of Char; begin FillChar(FromBuf,SizeOf(FromBuf),0); FillChar(ToBuf,SizeOf(ToBuf),0); StrPCopy(FromBuf,PChar(FileSoureDir)); StrPCopy(ToBuf,PChar(FileDestDir)); //设定结构体,以供文件操作 with OPStruct do begin Wnd := aHandle; wFunc := FO_Copy; pFrom := @FromBuf; pTo := @ToBuf; fFlags:= FOF_NOCONFIRMATION +FOF_RENAMEONCOLLISION; fAnyOperationsAborted := False; hNameMappings := nil; lpszProgressTitle := nil; end; //with if SHFileOperation(OPStruct)<>0 then Result := False else Result := True; end; //应该够用了吧!
//============================================================================== //拷贝目录(包括子目录一起拷贝)************************************************ //============================================================================== procedure XCopyDir(SourceDir, TargetDir: string); var DirInfo: TSearchRec; DosError: Integer; begin DosError := FindFirst(SourceDir+'\*.*', FaAnyfile, DirInfo); if not DirectoryExists(TargetDir) then ForceDirectories(TargetDir); while DosError=0 do begin if ((DirInfo.Attr and FaDirectory)=faDirectory) and (DirInfo.Name<>'.') and (DirInfo.Name<>'..') then XCopyDir(SourceDir + '\' + DirInfo.Name, TargetDir + '\' + DirInfo.Name); {$IF DEFINED(WIN32) AND DECLARED(UsingVCL)} if ((DirInfo.Attr and FaDirectory)<>FaDirectory) and ((DirInfo.Attr and FaVolumeID)<>FaVolumeID) {$ELSE} if ((DirInfo.Attr and FaDirectory)<>FaDirectory) {$IFEND} then CopyFile(PChar(SourceDir + '\' + DirInfo.Name), PChar(TargetDir + '\' + DirInfo.Name), false); DosError := FindNext(DirInfo); end; SysUtils.FindClose(DirInfo); end;
shellapi.pas中间有,自己找找shell的api函数
dephi 自带了目录拷贝函数码?
function CopyDirectory(const Source, Dest: string): boolean; var fo: TSHFILEOPSTRUCT; begin FillChar(fo, SizeOf(fo), 0); with fo do begin Wnd := 0; wFunc := FO_COPY; pFrom := PChar(source+#0); pTo := PChar(Dest+#0); fFlags := FOF_NOCONFIRMATION+FOF_NOCONFIRMMKDIR ; end; Result := (SHFileOperation(fo) = 0); end; 切记在pFrom,pTo得后面要加两个NULL.
var
OPStruct : TSHFileOpStruct;
FromBuf,ToBuf : Array[0..128] of Char;
begin
FillChar(FromBuf,SizeOf(FromBuf),0);
FillChar(ToBuf,SizeOf(ToBuf),0);
StrPCopy(FromBuf,PChar(FileSoureDir));
StrPCopy(ToBuf,PChar(FileDestDir));
//设定结构体,以供文件操作
with OPStruct do
begin
Wnd := aHandle;
wFunc := FO_Copy;
pFrom := @FromBuf;
pTo := @ToBuf;
fFlags:= FOF_NOCONFIRMATION +FOF_RENAMEONCOLLISION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end; //with
if SHFileOperation(OPStruct)<>0 then
Result := False
else
Result := True;
end;
//应该够用了吧!
//拷贝目录(包括子目录一起拷贝)************************************************
//==============================================================================
procedure XCopyDir(SourceDir, TargetDir: string);
var DirInfo: TSearchRec;
DosError: Integer;
begin
DosError := FindFirst(SourceDir+'\*.*', FaAnyfile, DirInfo);
if not DirectoryExists(TargetDir) then ForceDirectories(TargetDir);
while DosError=0 do
begin
if ((DirInfo.Attr and FaDirectory)=faDirectory) and (DirInfo.Name<>'.') and (DirInfo.Name<>'..')
then XCopyDir(SourceDir + '\' + DirInfo.Name, TargetDir + '\' + DirInfo.Name);
{$IF DEFINED(WIN32) AND DECLARED(UsingVCL)}
if ((DirInfo.Attr and FaDirectory)<>FaDirectory) and ((DirInfo.Attr and FaVolumeID)<>FaVolumeID)
{$ELSE}
if ((DirInfo.Attr and FaDirectory)<>FaDirectory)
{$IFEND}
then CopyFile(PChar(SourceDir + '\' + DirInfo.Name), PChar(TargetDir + '\' + DirInfo.Name), false);
DosError := FindNext(DirInfo);
end;
SysUtils.FindClose(DirInfo);
end;
var
fo: TSHFILEOPSTRUCT;
begin
FillChar(fo, SizeOf(fo), 0);
with fo do
begin
Wnd := 0;
wFunc := FO_COPY;
pFrom := PChar(source+#0);
pTo := PChar(Dest+#0);
fFlags := FOF_NOCONFIRMATION+FOF_NOCONFIRMMKDIR ;
end;
Result := (SHFileOperation(fo) = 0);
end;
切记在pFrom,pTo得后面要加两个NULL.
SHFileOperation
他可以实现文件的拷贝,删除包括目录
你可以看看msdn的帮助
他有几个参数
wfunc 需要干什么 fo_copy fo_delete fo_move
pfrom 要拷贝的地方
pto 要拷贝到的地方
fflags 需要怎么运行这个拷贝删除和移动,比如简单的到回收站的提示就
可以设置这个参数就可以了
每个之间用1个Null
pchar 是只有一个nUll