通过调用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次时将会产生一个“复件 ××”
我想问的是有没有方法能让他自动替换原有的文件呢?就是替换拷贝!

解决方案 »

  1.   

    UPUP!!!怎么没人啊!!大家帮帮忙好吗?
      

  2.   

    用MoveFileEx试试吧,他有MOVEFILE_REPLACE_EXISTING标志
      

  3.   

    不好意思,是复制哈,错啦
    是copyfile,bFailIfExists标志是来设置是否覆盖的。
      

  4.   

    这种方法可行,我一直用:
    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);
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      source,dest: array[0..255] of Char;
    begin
      strpcopy(source,'f:\a.TXT');
      strpcopy(dest,'h:\a.txt');
      CopyFile(source,dest,false);
    end;
      

  6.   

    哪个类型我没用过,
    你看看这个:copyfile(pchar(源文件名),pchar(目的文件名),false);,最后这个false就表示如果目标存在,则替换。同时还有一系列函数可以完成改名,删除等文件操作。
      

  7.   

    将你的 F.fFlags:=FOF_ALLOWUNDO OR FOF_RENAMEONCOLLISION; 换成
        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;  //如果操作出错,不显示用户借口
      

  8.   

    搞定,把你那个F.fFlags:=FOF_ALLOWUNDO OR FOF_RENAMEONCOLLISION换成
    F.fFlags:=FOF_FILESONLY即可。。
    结帖吧,呵呵
      

  9.   

    不用那么复杂吧。。晕
    我刚测试完,只用FOF_FILESONLY一个即可实现。。
    呵呵
      

  10.   

    copyfile(pchar(adoquery1.FieldByName('phot').AsString),pchar('d:\bmp\'+ExtractFileName(openpicturedialog1.FileName)),false);
    可以实现