ftpads  是  被复制的目录
如 Restore('D:\123\','E:\123')  就是把D:\123\  复制到  E:\123\
我的要求是 完全复制完毕 函数为True ,中途停止(有个按钮)函数为False
因为子目录的复制用了循环,我不知道应该把Result写哪,我怎么才能知道他完全复制完毕了?
小弟刚学Delphi  代码是网上找来,再自己修改的,有不合理的地方还希望大侠们帮小弟改过来,谢谢function TForm1.Restore(ftpads, copyads: string): Boolean;
var
  sr:TSearchRec;
  FromFile, ToFile: TFileStream;
  PackSize, CurrentSize: integer;
  SubDirectory: TStringList;
  i: integer;begin
if Restoring=true then
begin
    if FindFirst(ftpads + '*.*', faAnyFile, sr) = 0 then
    begin
      repeat
        if ((sr.Attr and faDirectory)<>16) and (sr.Name<>'.') and (sr.Name<>'..') and (Restoring=true) then
        begin
          StatusBar1.Panels[0].Text:=copyads + sr.Name;
            Memo1.Lines.Add('Download:  ' + copyads + sr.Name);
            PackSize:= 4096;
            ProgressBar1.Max := sr.Size div PackSize;
            FromFile := TFileStream.Create(ftpads + sr.Name, fmOpenRead);
            try
              ToFile := TFileStream.Create(copyads + sr.Name, fmCreate);
              try
                CurrentSize := 0;
                repeat
                  if sr.Size - CurrentSize <= PackSize then
                    PackSize := sr.Size - CurrentSize;
                  ToFile.CopyFrom(FromFile, PackSize);
                  Inc(CurrentSize, PackSize);
                  ProgressBar1.Position := ProgressBar1.Position + 1;
                until CurrentSize >= sr.Size;
                GetFileTime(FromFile.Handle, @CreateFT, @LastAccessFT, @LastWriteFT);
                SetFileTime(ToFile.Handle, @CreateFT, @LastAccessFT, @sr.FindData.ftLastWriteTime);
              finally
                ToFile.Free;
              end
            finally
              FromFile.Free;
            end;
        end;
        Application.ProcessMessages;
      until (FindNext(sr) <> 0);
      FindClose(sr);
    end;    //=============遍历子目录部分==============//
    SubDirectory:= TStringList.Create;
    try
      if (FindFirst(ftpads + '*.*', faAnyFile, sr) = 0) then
      begin
        repeat
          if ((sr.Attr and faDirectory)=16) and ((sr.Attr and SysUtils.faSysFile)<>4) and (sr.Name<>'.') and (sr.Name<>'..') and (Restoring=true) then
          begin
            SubDirectory.Add(sr.Name);
            if not DirectoryExists(copyads+sr.Name+'\') then
              ForceDirectories(copyads+sr.Name+'\');
          end;
          Application.ProcessMessages;
        until FindNext(sr)<>0;
        FindClose(sr);
      end;
      for i:=0 to SubDirectory.Count-1 do
      begin
        if Restore(ftpads + SubDirectory.Strings[i] + '\', copyads + SubDirectory.Strings[i] + '\') = false then
          break;
      end;
    finally
      SubDirectory.Free;
    end;
  end else//========Restoring=false  中途停止
  begin  end;//    Result:= True;
//  memo1.Lines.Add('修复完毕');
//  Restoring:= False;
end;

解决方案 »

  1.   

    上面
    GetFileTime(FromFile.Handle, @CreateFT, @LastAccessFT, @LastWriteFT);
    SetFileTime(ToFile.Handle, @CreateFT, @LastAccessFT, @sr.FindData.ftLastWriteTime);
    要去掉,呵呵
      

  2.   

    以前做的,你修改一下就行了,多加点检测procedure CopyTree( ASrcDir, ATrgDir: string );
    var
        sr: TSearchRec;
    begin
        if( FindFirst( ASrcDir + '*.*', faAnyFile, sr ) = 0 ) then
        begin
            Repeat
                if( sr.Name <> '.' ) and (sr.Name <> '..' ) then
                begin
                    if( sr.Attr and faDirectory ) > 0 then
                    begin
                        //如果是目录,则在目录路径中创建相同的目录,递归s
                        mkdir( ATrgDir + sr.Name );                    CopyTree( ASrcDir + sr.Name + '\', ATrgDir + sr.Name + '\' );
                    end
                    else begin
                        CopyFile( PChar(ASrcDir + sr.Name), PChar(ATrgDir + sr.Name), False );
                    end;
                end;
            until( FindNext(sr) <> 0 );
        end;
        SysUtils.FindClose( sr );
    end;
      

  3.   

    在你中途停止上面那行返回True
      

  4.   

    这个试试,我试过了,可以实现function TMainForm.RestorePath(FromPath, ToPath: string): Boolean;
      procedure RestoreDir(FromDir, ToDir: string);
      var
        sr: TSearchRec;
        Er: Integer;
      begin
        Er := FindFirst(ToDir + '\' + '*.*', faAnyFile, sr);
        while Er = 0 do
        begin
          if Restoring then
          begin
            if (sr.Name[1] <> '.') and ((sr.Attr and SysUtils.faSysFile) <> 4) then
            begin
              if (not DirectoryExists(FromDir + '\' + sr.Name)) and
                (not FileExists(FromDir + '\' + sr.Name)) then
              begin
                if DelPath(self.Handle, ToDir + '\' + sr.Name) then
                  memo1.Lines.Add('删除成功-->' + ToDir + '\' + sr.Name)
                else
                  memo1.Lines.Add('删除失败-->' + ToDir + '\' + sr.Name)
              end;
            end;
            Er := FindNext(sr);
          end
          else
            Break;
        end;    Er := FindFirst(FromDir + '\' + '*.*', faAnyFile, sr);
        while Er = 0 do
        begin
          if Restoring then
          begin
            if (sr.Name[1] <> '.') then
            begin
              //找到文件
              if (sr.Attr and faDirectory) = 0 then
              begin
                StatusBar1.Panels[0].Text := ToDir + '\' + sr.Name;
                if CompareFile(sr, ToDir + '\' + sr.Name) then
                  Memo1.Lines.Add('Check:     ' + ToDir + '\' + sr.Name)
                else
                begin
                  if CopyFile(FromDir + '\' + sr.Name, ToDir + '\' + sr.Name) then
                    Memo1.Lines.Add('复制成功-->' + ToDir + '\' + sr.Name)
                  else
                    Memo1.Lines.Add('复制失败-->' + ToDir + '\' + sr.Name);
                end;
              end
              else //找到子目录
              if ((sr.Attr and faDirectory) = 16) then
              begin
                ChDir(FromDir + '\' + sr.Name);
                RestoreDir(FromDir + '\' + sr.Name, ToDir + '\' + sr.Name);
                ChDir('..');
              end;
            end;
            Er := FindNext(sr);
            Application.ProcessMessages;
          end
          else
            Break;
        end;
        FindClose(sr);
      end;
    begin
      Memo1.Lines.Clear;
      RestoreDir(FromPath, ToPath);
      if Restoring = true then
      begin
        Result := true;
        Memo1.Lines.Add(Topath + ' 修复完毕!');
      end
      else
      begin
        Result := false;
        Memo1.Lines.Add('修复 ' + ToPath + ' 时被终止!');
      end;
      ProgressBar1.Position := 0;
      StatusBar1.Panels[0].Text := '';
    end;procedure TMainForm.bsSkinButton1Click(Sender: TObject);
    begin
      if bsSkinButton1.Caption = '修    复' then
      begin
        bsSkinButton1.Caption := '停止修复';
        Restoring := true;
      end;
      if bsSkinButton1.Caption = '停止修复' then
      begin
        Restoring := false;
        bsSkinButton1.Caption := '修    复';
      end;
    end;