如何完成类似DOS中砍树命令(deltree/y)的功能???(100分)

  • 主题发起人 主题发起人 兔爷
  • 开始时间 开始时间
恩<br>我马上就下网了<br><br>明天再给你想要的答案好吗????<br>拜拜
 
procedure DeleteTree(Path: String);<br>var<br>&nbsp; Rec: TSearchRec;<br>&nbsp; Found: Integer;<br>begin<br>&nbsp; Found := FindFirst(Path + '*.*', faAnyFiles, Rec);<br>&nbsp; while Found = 0 do begin<br>&nbsp; &nbsp; if (Rec.Attr and faDirectory &lt;&gt; 0) and (Rec.Name &lt;&gt; '.') and (Rec.Name &lt;&gt; '..') then <br>&nbsp; &nbsp; &nbsp; DeleteTree(Path + Rec.Name + '/')<br>&nbsp; &nbsp; else DeleteFile(Path + Rec.Name);<br>&nbsp; &nbsp; Found := FindNext(Rec);<br>&nbsp; end;<br>&nbsp; FindClose(Rec);<br>&nbsp; RmDir(Copy(Path, 1, Length(Path) - 1));<br>end;
 
<br>  delphi提供了关于文件操作的许多函数,其中关于目录操作的有目录的创建与删除、设置当前目录、获取当前目录等。目录的删除有函数(function)removedir和过程(procedure)rmdir,但它们都只能删除空目录,对于非空目录则不能删除。要实现删除整个目录树(deltree)必须编写程序来删除其中的子目录和文件。 <br><br>  目录中的文件可以通过调用函数deletefile来删除,但对于特殊文件(只读、系统、隐藏等)则不能有效删除,必须更改文件属性为普通文件才能删除。更改文件属性可以用函数filesetattr,这里将特殊文件的属性设置为普通文件属性(属性值为0)。 <br><br>  考虑到树型目录结构最适合于递归方法,所有这里用递归算法来实现deltree函数。下面是具体实现程序。 <br><br>  //path是需删除的目录路径 <br><br>  //目录成功删除返回true,否则返回false <br><br>  function tform1.deltree (path : string): boolean ; <br><br>  var <br><br>   searchrec: tsearchrec; <br><br>  begin <br><br>  //判断目录是否存在 <br><br>if directoryexists(path) then <br><br>begin <br><br>  //进入该目录,删除其中的子目录和文件 <br><br>   olddir := getcurrentdir; <br><br>   chdir(path); <br><br>  //查找目录中所有任何文件 <br><br>  findfirst(′?.?′, faanyfile, searchrec); <br><br>  repeat <br><br>  //修改文件属性为普通属性值 <br><br>   filesetattr(searchrec.name,0); <br><br>  //如果是目录并且不是.和..则递归调用deltree <br><br>  if(searchrec.attr and fadirectory &gt; 0) then <br><br>  begin <br><br>  if(searchrec.name[1]&lt;&gt;′.′) then <br><br>  if(not deltree(searchrec.name)) then <br><br>  break; <br><br>  end <br><br>  //如果是文件直接删除 <br><br>  else <br><br>  if(not deletefile(searchrec.name))then <br><br>  break ; <br><br>  //继续查找,直到最后 <br><br>  until (findnext(searchrec)&lt;&gt;0) ; <br><br>  //回到父目录,删除该目录 <br><br>  chdir(′..′); <br><br>  result := removedir(path); <br><br>setcurrentdir(olddir); <br><br>  end <br><br>  else <br><br>  result := false ; <br><br>  end ; <br><br>  该程序在windows 98、delphi 4.0下编译通过。 &nbsp;<br><br>ok???????????<br>
 
JohnsonGuo,wsn说的都对,用的是递归。<br>其实有更好的办法,window asi已经有了,查查SHFileOperation就知道了
 
除非你还在win16下编程,否则SHFileOperation轻松搞定
 
接受答案了.
 
后退
顶部