//Copy 多个文件的处理: function CopyFiles(const Source,Dest: string): boolean; var fo: TSHFILEOPSTRUCT; begin FillChar(fo, SizeOf(fo), 0); with fo do begin Wnd := 0; wFunc := FO_COPY; pFrom := @source[1]; pTo :=pchar(dest); fFlags := FOF_NOCONFIRMATION+FOF_NOCONFIRMMKDIR ; end; Result := (SHFileOperation(fo) = 0); end;procedure TForm1.Button1Click(Sender: TObject); var str:string; i:integer; begin if opendialog1.Execute then begin for i:=0 to OpenDialog1.Files.Count-1 do str:=str+OpenDialog1.Files.strings[i]+#0; showmessage(str); str:=str+#0; CopyFiles(str,'d:\temp'); end; end;
用WINAPI,SHFileOperation来实现,再看看介绍!
直接用一个循环调用CopyFile岂不是更简单。
TO 回复人: Drate(小虫) ( ) :
TO 回复人: Drate(小虫) ( ) : 我试过你的例程, 只能拷贝单个文件不能拷贝多个文件。 在OpenDialog1好像只能选择单个文件?
function CopyFiles(const Source,Dest: string): boolean;
var
fo: TSHFILEOPSTRUCT;
begin
FillChar(fo, SizeOf(fo), 0);
with fo do
begin
Wnd := 0;
wFunc := FO_COPY;
pFrom := @source[1];
pTo :=pchar(dest);
fFlags := FOF_NOCONFIRMATION+FOF_NOCONFIRMMKDIR ;
end;
Result := (SHFileOperation(fo) = 0);
end;procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
i:integer;
begin
if opendialog1.Execute then
begin
for i:=0 to OpenDialog1.Files.Count-1 do
str:=str+OpenDialog1.Files.strings[i]+#0;
showmessage(str);
str:=str+#0;
CopyFiles(str,'d:\temp');
end;
end;
我试过你的例程, 只能拷贝单个文件不能拷贝多个文件。
在OpenDialog1好像只能选择单个文件?
直接调用循是可以,麻烦你给出一个例程,好吗?
提醒你一下,要对文件名为.和..的两个文件特别处理一下,否则的话你要陷入死循环当中的.
var
T: TSHFileOpStruct;
FromDir:PChar;
ToDir:PChar;
begin
GetMem(FromDir,Length(From)+2);
try
GetMem(ToDir,Length(Dest)+2);
try
FillChar(FromDir^,Length(From)+2,0);
FillChar(ToDir^,Length(Dest)+2,0); StrCopy(FromDir,PChar(From));
StrCopy(ToDir,PChar(Dest)); with T do
begin
Wnd :=0;
wFunc :=FO_COPY;
pFrom :=FromDir;
pTo :=ToDir;
fFlags :=FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
fAnyOperationsAborted:=False;
hNameMappings:=nil;
lpszProgressTitle:=nil;
if SHFileOperation(T)<>0 then
raise Exception.Create('拷贝操作不成功');
end;
finally
FreeMem(ToDir,Length(Dest)+2);
end;
finally
FreeMem(FromDir,Length(From)+2);
end;
end;百试不爽