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;
Var Sr:TSearchRec; begin If FindFirst('E:\TransparentDesktop\*.*',FaAnyFile,sr)=0 Then Begin Repeat IF (Sr.Name='.') Or (sr.Name='..') Then Continue; CopyFile(Pchar('E:\TransparentDesktop\'+Sr.Name),Pchar('E:\aaa\'+Sr.Name),False); Until FindNext(sr)<>0; FindClose(Sr); End; end;
首先你需要写一个递归,找出要复制的文件佳下面的所有的文件。
然后和你要复制到的文件夹下面的文件挨个的比对。
如果是文件夹那么看看以前存在不存在,如果不存在就创建。
如果是文件:
如果文件不存在,那么用ForceDirectories强制创建所有的上级的文件夹,然后进行拷贝(用文件流或者其他的办法)。
如果文件存在的话就用覆盖的方式重新写。大概就是这个样子。
我以前的代码分离出来挺麻烦的,大概就是这个思路,你自己在看看吧。我的方法可能不聪明,你也可以再借鉴一下别人的方法。
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;
Sr:TSearchRec;
begin
If FindFirst('E:\TransparentDesktop\*.*',FaAnyFile,sr)=0 Then
Begin
Repeat
IF (Sr.Name='.') Or (sr.Name='..') Then
Continue;
CopyFile(Pchar('E:\TransparentDesktop\'+Sr.Name),Pchar('E:\aaa\'+Sr.Name),False);
Until FindNext(sr)<>0;
FindClose(Sr);
End;
end;