---- 1、拷贝目录 <br><br>---- 为了能拷贝目录下带有子目录的情况,先定义一个辅助的拷贝函数,它是递归执行的,直到把目录下的所有文件和子目录都拷贝完。 <br><br>---- 1.1拷贝目录的递归辅助函数:DoCopyDir <br><br>function DoCopyDir(sDirName:String;<br>sToDirName:String):Boolean;<br>var<br> hFindFile:Cardinal;<br> t,tfile:String;<br> sCurDir:String[255];<br> FindFileData:WIN32_FIND_DATA;<br>begin<br> //先保存当前目录<br> sCurDir:=GetCurrentDir;<br> ChDir(sDirName);<br> hFindFile:=FindFirstFile('*.*',FindFileData);<br> if hFindFile< >INVALID_HANDLE_VALUE then<br> begin<br> if not DirectoryExists(sToDirName) then<br> ForceDirectories(sToDirName);<br> repeat<br> tfile:=FindFileData.cFileName;<br> if (tfile='.') or (tfile='..') then<br> Continue;<br> if FindFileData.dwFileAttributes=<br> FILE_ATTRIBUTE_DIRECTORY then<br> begin<br> t:=sToDirName+'/'+tfile;<br> if not DirectoryExists(t) then<br> ForceDirectories(t);<br> if sDirName[Length(sDirName)]< >'/' then<br> DoCopyDir(sDirName+'/'+tfile,t)<br> else<br> DoCopyDir(sDirName+tfile,sToDirName+tfile);<br> end<br> else<br> begin<br> t:=sToDirName+'/'+tFile;<br> CopyFile(PChar(tfile),PChar(t),True);<br> end;<br> until FindNextFile(hFindFile,FindFileData)=false;<br> FindClose(hFindFile);<br> end<br> else<br> begin<br> ChDir(sCurDir);<br> result:=false;<br> exit;<br> end;<br> //回到原来的目录下<br> ChDir(sCurDir);<br> result:=true;<br>end;<br><br>---- 1.2拷贝目录的函数:CopyDir <br><br>function CopyDir(sDirName:String;<br>sToDirName:string):Boolean;<br>begin<br> if Length(sDirName)< =0 then<br> exit;<br> //拷贝...<br> Result:=DoCopyDir(sDirName,sToDirName);<br>end;<br><br>---- 2、删除目录 <br><br>---- 删除目录与拷贝目录很类似,但为了能删除位于根目录下的一个空目录,需要在辅助函数中设置一个标志变量,即:如果删除的是空目录,则置bEmptyDir为True,这一句已经用深色框表示了。 <br><br>---- 2.1删除目录的递归辅助函数:DoRemoveDir <br><br>function DoRemoveDir(sDirName:String):Boolean;<br>var<br> hFindFile:Cardinal;<br> tfile:String;<br> sCurDir:String;<br> bEmptyDir:Boolean;<br> FindFileData:WIN32_FIND_DATA;<br>begin<br> //如果删除的是空目录,则置bEmptyDir为True<br> //初始时,bEmptyDir为True<br> bEmptyDir:=True;<br> //先保存当前目录<br> sCurDir:=GetCurrentDir;<br> SetLength(sCurDir,Length(sCurDir));<br> ChDir(sDirName);<br> hFindFile:=FindFirstFile('*.*',FindFileData);<br> if hFindFile< >INVALID_HANDLE_VALUE then<br> begin<br> repeat<br> tfile:=FindFileData.cFileName;<br> if (tfile='.') or (tfile='..') then<br> begin<br> bEmptyDir:=bEmptyDir and True;<br> Continue;<br> end;<br> //不是空目录,置bEmptyDir为False<br> bEmptyDir:=False;<br> if FindFileData.dwFileAttributes=<br> FILE_ATTRIBUTE_DIRECTORY then<br> begin<br> if sDirName[Length(sDirName)]< >'/' then<br> DoRemoveDir(sDirName+'/'+tfile)<br> else<br> DoRemoveDir(sDirName+tfile);<br> if not RemoveDirectory(PChar(tfile)) then<br> result:=false<br> else<br> result:=true;<br> end<br> else<br> begin<br> if not DeleteFile(PChar(tfile)) then<br> result:=false<br> else<br> result:=true;<br> end;<br> until FindNextFile(hFindFile,FindFileData)=false;<br> FindClose(hFindFile);<br> end<br> else<br> begin<br> ChDir(sCurDir);<br> result:=false;<br> exit;<br> end;<br> //如果是空目录,则删除该空目录<br> if bEmptyDir then<br> begin<br> //返回上一级目录<br> ChDir('..');<br> //删除空目录<br> RemoveDirectory(PChar(sDirName));<br> end;<br><br> //回到原来的目录下<br> ChDir(sCurDir);<br> result:=true;<br>end;<br><br>---- 2.2删除目录的函数:DeleteDir <br><br>function DeleteDir(sDirName:String):Boolean;<br>begin<br> if Length(sDirName)< =0 then<br> exit;<br> //删除...<br> Result:=DoRemoveDir(sDirName) and RemoveDir(sDirName);<br>end;<br><br>---- 3、移动目录 <br><br>---- 有了拷贝目录和删除目录的函数,移动目录就变得很简单,只需顺序调用前两个函数即可: <br><br>function MoveDir(sDirName:String;<br>sToDirName:string):Boolean;<br>begin<br> if CopyDir(sDirName,sToDirName) then<br> if RemoveDir(sDirName) then<br> result:=True<br> else<br> result:=false;<br>end;<br><br>///////////////////////////////////////////////<br>procedure TForm1.Button2Click(Sender: TObject);<br>var<br> OpStruc: TSHFileOpStruct;<br> frombuf, tobuf: Array [0..128] of Char;<br>Begin<br> FillChar( frombuf, Sizeof(frombuf), 0 );<br> FillChar( tobuf, Sizeof(tobuf), 0 );<br> StrPCopy( frombuf, 'd:/brief/*.*' );<br> StrPCopy( tobuf, 'd:/temp/brief' );<br> With OpStruc DO Begin<br> Wnd:= Handle;<br> wFunc:= FO_COPY;<br> pFrom:= @frombuf;<br> pTo:=@tobuf;<br> fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;<br> fAnyOperationsAborted:= False;<br> hNameMappings:= Nil;<br> lpszProgressTitle:= Nil;<br><br> end;<br> ShFileOperation( OpStruc );<br>end;<br>