通过调用Win 95系统外壳来完成,需要在USES子句中添加SHELLAPI单元。这种方法与Win 95下
文件拷贝的方式完全一样,也会自动出现“正在拷贝...”的提示。如果目标文件已经存在,函数可以根据操作标志位自动生成多份复件。
改变wFunc的值,则可以完成删除、更名、放到回收站等功能。笔者认为这是最好的一种方法。 procedure TForm1.copyClick(Sender: TObject);
var
F:TShFileOpStruct;
begin
F.wnd:=Handle;
F.wFunc:=FO_COPY; {操作方式}
F.pFrom:='E:\1';
F.pTo:='E:\2';
F.fFlags:=FOF_ALLOWUNDO OR FOF_RENAMEONCOLLISION; {操作选项}
if ShFileOperation(F)<>0 then
ShowMessage('文件拷贝失败!')
else showmessage('文件拷贝成功');
end;这种COPY方式是如果该文件已经被COPY过一次,COPY第2次时将会产生一个“复件 ××”
我想问的是有没有方法能让他自动替换原有的文件呢?就是替换拷贝!
文件拷贝的方式完全一样,也会自动出现“正在拷贝...”的提示。如果目标文件已经存在,函数可以根据操作标志位自动生成多份复件。
改变wFunc的值,则可以完成删除、更名、放到回收站等功能。笔者认为这是最好的一种方法。 procedure TForm1.copyClick(Sender: TObject);
var
F:TShFileOpStruct;
begin
F.wnd:=Handle;
F.wFunc:=FO_COPY; {操作方式}
F.pFrom:='E:\1';
F.pTo:='E:\2';
F.fFlags:=FOF_ALLOWUNDO OR FOF_RENAMEONCOLLISION; {操作选项}
if ShFileOperation(F)<>0 then
ShowMessage('文件拷贝失败!')
else showmessage('文件拷贝成功');
end;这种COPY方式是如果该文件已经被COPY过一次,COPY第2次时将会产生一个“复件 ××”
我想问的是有没有方法能让他自动替换原有的文件呢?就是替换拷贝!
是copyfile,bFailIfExists标志是来设置是否覆盖的。
function Tform1.DoCopyDir(sDirName: string; sToDirName: string): Boolean;
var
hFindFile: Cardinal;
t, tfile: string;
sCurDir: string[255];
FindFileData: WIN32_FIND_DATA;
begin
//先保存当前目录
sCurDir := GetCurrentDir;
ChDir(sDirName);
hFindFile := FindFirstFile('*.*', FindFileData);
if hFindFile <> INVALID_HANDLE_VALUE then
begin
if not DirectoryExists(sToDirName) then
ForceDirectories(sToDirName);
repeat
tfile := FindFileData.cFileName;
if (tfile = '.') or (tfile = '..') then
Continue;
if FindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
begin
t := sToDirName + '\' + tfile;
if not DirectoryExists(t) then
ForceDirectories(t);
if sDirName[Length(sDirName)] <> '\' then
DoCopyDir(sDirName + '\' + tfile, t)
else
DoCopyDir(sDirName + tfile, sToDirName + tfile);
end
else
begin
t := sToDirName + '\' + tFile;
CopyFile(PChar(tfile), PChar(t), False);
label2.Caption := tfile;
label2.Update;
gauge1.Progress := gauge1.Progress + 1;
end;
until FindNextFile(hFindFile, FindFileData) = false;
//FindClose(hFindFile);
end
else
begin
ChDir(sCurDir);
result := false;
exit;
end;
//回到原来的目录下
ChDir(sCurDir);
result := true;
end;调用时用:
if DoCopyDir(源目录, 目标目录) then
messagedlg('恭喜!!系统升级成功,谢谢您的使用!!请重新登录!!', mtinformation, [mbyes], 0)
else
messagedlg('很抱歉!系统更新不成功,请手工方式更新!!', mterror, [mbyes], 0);
var
source,dest: array[0..255] of Char;
begin
strpcopy(source,'f:\a.TXT');
strpcopy(dest,'h:\a.txt');
CopyFile(source,dest,false);
end;
你看看这个:copyfile(pchar(源文件名),pchar(目的文件名),false);,最后这个false就表示如果目标存在,则替换。同时还有一系列函数可以完成改名,删除等文件操作。
fFlags:=FOF_NOCONFIRMMKDIR+FOF_NOCONFIRMATION+FOF_SIMPLEPROGRESS ;
fAnyOperationsAborted:=False;
就不会了
在ShellAPI单元的第200行对wFunc参数的取值定义了4种操作:
{$EXTERNALSYM FO_MOVE}
FO_MOVE = $0001; //移动操作,从pFrom到pTo
{$EXTERNALSYM FO_COPY}
FO_COPY = $0002; //复制操作,从pFrom到pTo
{$EXTERNALSYM FO_DELETE}
FO_DELETE = $0003; //删除操作,删除pFrom中指定的目录或文件(忽略//
pTo参数)
{$EXTERNALSYM FO_RENAME}
FO_RENAME = $0004; //重命名操作,重命名pFrom中指定的目录或文件。
在ShellAPI单元的第210行对fFlags参数定义了如下可能取值:
{$EXTERNALSYM FOF_MULTIDESTFILES}
FOF_MULTIDESTFILES = $0001; //表明pTo 参数是多个文件而不是一个//目
录
{$EXTERNALSYM FOF_CONFIRMMOUSE}
FOF_CONFIRMMOUSE = $0002; //目前没有实现
{$EXTERNALSYM FOF_SILENT}
FOF_SILENT = $0004; //不创建进度条/报告
{$EXTERNALSYM FOF_RENAMEONCOLLISION}
FOF_RENAMEONCOLLISION = $0008; //当目标文件已存在时,将源文件改
//名再复制或移动
{$EXTERNALSYM FOF_NOCONFIRMATION}
FOF_NOCONFIRMATION = $0010; //操作过程中不显示确认信息,相当//于用
户选择了“yes to all”
{$EXTERNALSYM FOF_WANTMAPPINGHANDLE}
FOF_WANTMAPPINGHANDLE = $0020; //填充hNameMappings成员
{$EXTERNALSYM FOF_ALLOWUNDO}
FOF_ALLOWUNDO = $0040; //允许撤销操作
{$EXTERNALSYM FOF_FILESONLY}
FOF_FILESONLY = $0080; //只操作文件
{$EXTERNALSYM FOF_SIMPLEPROGRESS}
FOF_SIMPLEPROGRESS = $0100; //显示进度条对话框但不显示文件名
{$EXTERNALSYM FOF_NOCONFIRMMKDIR}
FOF_NOCONFIRMMKDIR = $0200; //新建目录时不提示确认
{$EXTERNALSYM FOF_NOERRORUI}
FOF_NOERRORUI = $0400; //如果操作出错,不显示用户借口
F.fFlags:=FOF_FILESONLY即可。。
结帖吧,呵呵
我刚测试完,只用FOF_FILESONLY一个即可实现。。
呵呵
可以实现