我想做一个备份功能的软件,目的就是执行该软件,可以把指定的文件夹(如c:\test\*.*)下的所有文件(可能还包括子文件夹)拷贝到指定的文件夹(D:\test\)下,对单个文件可以拷贝复制,但是如何对整个目录下的文件或文件夹进行复制呢?请大家给我一点建议!谢谢!

解决方案 »

  1.   

    循环查找如果不是文件(没有“.”)则MDDIR 否则COPYFILE;
      

  2.   

    删除目录:function DelDirectory(const Source:string): boolean;
    var
      fo: TSHFILEOPSTRUCT;
    begin
      FillChar(fo, SizeOf(fo), 0);
      with fo do
      begin
        Wnd := 0;
        wFunc := FO_DELETE;
        pFrom := PChar(source+#0);
        pTo := #0#0;
        fFlags := FOF_NOCONFIRMATION+FOF_SILENT;
      end;
      Result := (SHFileOperation(fo) = 0);
    end;
    复制目录:
    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;重新命名:
    用MoveFile()或者下面的函数也可以。
    //RenDirectory('d:\wt2','d:\bcde');
    function RenDirectory(const OldName,NewName:string): boolean;
    var
      fo: TSHFILEOPSTRUCT;
    begin
      FillChar(fo, SizeOf(fo), 0);
      with fo do
      begin
        Wnd := 0;
        wFunc := FO_RENAME;
        pFrom := PChar(OldName+#0);
        pTo := pchar(NewName+#0);
        fFlags := FOF_NOCONFIRMATION+FOF_SILENT;
      end;
      Result := (SHFileOperation(fo) = 0);
    end;
    //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;
      

  3.   

    procedure XCopyDir(SourceDir, TargetDir: string);
    var DirInfo: TSearchRec;
        DosError: Integer;
    begin
      DosError := FindFirst(SourceDir+'\*.*', FaAnyfile, DirInfo);
      if not DirectoryExists(TargetDir) then ForceDirectories(TargetDir);
      while DosError=0 do
      begin
        if ((DirInfo.Attr and FaDirectory)=faDirectory) and (DirInfo.Name<>'.') and (DirInfo.Name<>'..')
        then XCopyDir(SourceDir + '\' + DirInfo.Name, TargetDir + '\' + DirInfo.Name);
        {$IF DEFINED(WIN32) AND DECLARED(UsingVCL)}
        if ((DirInfo.Attr and FaDirectory)<>FaDirectory) and ((DirInfo.Attr and FaVolumeID)<>FaVolumeID)
        {$ELSE}
        if ((DirInfo.Attr and FaDirectory)<>FaDirectory)
        {$IFEND}
        then CopyFile(PChar(SourceDir + '\' + DirInfo.Name), PChar(TargetDir + '\' + DirInfo.Name), false);
        DosError := FindNext(DirInfo);
      end;
      SysUtils.FindClose(DirInfo);
    end;
      

  4.   

    文件的复制和备份,我在我的项目中是这样实现的:
    procedure Tfrmdbout.Button1Click(Sender: TObject);
    begin
    openDialog1.Execute;
    edit1.Text:=openDialog1.FileName;
    end;procedure Tfrmdbout.BitBtn2Click(Sender: TObject);
    begin
    edit1.Text:='' ;
    edit2.Text:='';
    close;
    end;procedure Tfrmdbout.BitBtn1Click(Sender: TObject);
       var
    // i : integer;
     OpStruc: TSHFileOpStruct;
     FromBuf, ToBuf: Array [0..128] of Char;
    begin
    //对文件进行输出
     FillChar( FromBuf, Sizeof(FromBuf), 0 );
         FillChar( ToBuf, Sizeof(ToBuf), 0 );     StrPCopy( FromBuf, Pchar(edit1.text) );
         StrPCopy( ToBuf, Pchar(edit2.text) );
         // 设置OpStruc
         with OpStruc do
         begin
              Wnd:= Handle;
              wFunc:= FO_COPY;
              pFrom:= @FromBuf;
              pTo:=@ToBuf;
              fFlags:=FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
              fAnyOperationsAborted:= False;
              hNameMappings:= nil;
              lpszProgressTitle:= nil;
         end;
         if ShFileOperation( OpStruc ) <> 0 then
           begin
             MessageBox(Handle,'文件备份失败!','[系统文件备份信息]',MB_OK+MB_ICONINFORMATION);
             close;
           end
            else
           begin
            MessageBox(Handle,'文件备份完成!','[系统文件备份信息]',MB_OK+MB_ICONINFORMATION);
           end;
      edit1.Text:='' ;
    edit2.Text:='';end;procedure Tfrmdbout.Button2Click(Sender: TObject);
    begin
    saveDialog1.Execute;
    edit2.Text:=saveDialog1.FileName;
    end;希望对你有所帮助!