delphi 目录操作函数

简单实用的复制整个目录的方法

function CopyDirectory(const Hwd : LongWord; const SourcePath, DestPath : string): SmallInt;
var
  OpStruc: TSHFileOpStruct;
  frombuf, tobuf: Array [0..128] of Char;
Begin
  Result := -1;
  FillChar( frombuf, Sizeof(frombuf), 0 );
  FillChar( tobuf, Sizeof(tobuf), 0 );
  StrPCopy( frombuf,  SourcePath);
  StrPCopy( tobuf,  DestPath);
  With OpStruc DO Begin
    Wnd:= Hwd;
    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
    Result := 0;
end; 

Function Copydirectory(Source:string;pDirectory:string;pFilter:string):boolean;
//目录拷贝source :源目录  directory:目标目录  pFilter:文件类型筛选'/*.*'或'/*.???'
var
  OpStruc: TSHFileOpStruct;
  frombuf, tobuf: Array [0..128] of Char;
Begin
  FillChar( frombuf, Sizeof(frombuf), 0 );
  FillChar( tobuf, Sizeof(tobuf), 0 );
  StrPCopy(frombuf, Source+pFilter);
  StrPCopy( tobuf, pdirectory);
  if not directoryexists(pdirectory) then
        if not createdir(pdirectory) then
        begin
            showmessage('不能创建目录'+pdirectory+chr(13)+chr(10)+'或无该目录权限');
            exit;
        end;
  With OpStruc DO Begin
    Wnd:= 0;
    wFunc:= FO_Copy;
    pFrom:= @frombuf;
    pTo:=@tobuf;
    fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION or fof_filesonly;
    fAnyOperationsAborted:= false;
    hNameMappings:= Nil;
    lpszProgressTitle:= Nil;
  end;
  try
        ShFileOperation(OpStruc );
        CopyDirectory:=true;
  except
       CopyDirectory:=false;
       exit;
  end;


end;

为了能拷贝目录下带有子目录的情况,先定义一个辅助的拷贝函数,
它是递归执行的,直到把目录下的所有文件和子目录都拷贝完。

---- 1.1拷贝目录的递归辅助函数:DoCopyDir

function 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),True);
              end;
        until FindNextFile(hFindFile,FindFileData)=false;
        FindClose(hFindFile);
   end
   else
   begin
        ChDir(sCurDir);
        result:=false;
        exit;
   end;
   //回到原来的目录下
   ChDir(sCurDir);
   result:=true;
end;

---- 1.2拷贝目录的函数:CopyDir

function CopyDir(sDirName:String;
sToDirName:string):Boolean;
begin
      if Length(sDirName)< =0 then
         exit;
      //拷贝...
      Result:=DoCopyDir(sDirName,sToDirName);
end;
=============================================================================
uses ShellAPI;

....
ShellExecute(handle,'open', 'cmd.exe', 'copy c:/abc c:/def /e', '', sw_Normal);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值