function TForm1.DeletePath(mDirName: string): Boolean; { 返回删除指定目录是否成功 }
var
  vSearchRec: TSearchRec;
  vPathName: string;
  K: Integer;
begin
  Result := True;
  vPathName := mDirName + '\*.*';
  K := FindFirst(vPathName, faAnyFile, vSearchRec);
  while K = 0 do
  begin
    if (vSearchRec.Attr and faDirectory > 0) and
      (Pos(vSearchRec.Name, '..') = 0) 
      then begin
      FileSetAttr(mDirName + '\' + vSearchRec.Name, faDirectory);
      Result := DeletePath(mDirName + '\' + vSearchRec.Name);
           end
    else if Pos(vSearchRec.Name, '..') = 0
     then begin //删除非目录属性的文件
      FileSetAttr(mDirName + '\' + vSearchRec.Name, 0);
      Result := DeleteFile(PChar(mDirName + '\' + vSearchRec.Name));
          end;
    if not Result then Break;
    K := FindNext(vSearchRec);
  end;
  FindClose(vSearchRec);
  Result := RemoveDir(mDirName);
end; { DeletePath }
这是删除指定文件夹的函数,运行没问题,用递归实现的,可是当进入下一级子目录的时候完成文件的操作后是怎么返回上一级目录的呢?代码没看懂,请点拨一下,

解决方案 »

  1.   

    你只要判断FindXXX找到的是目录还是文件
    如果是文件就删除
    否则递归调用
      

  2.   

    K := FindFirst(vPathName, faAnyFile, vSearchRec);
      while K = 0 do
      begin
        //......循坏~~~至于递归的时候怎么保存堆栈恢复环境是系统的事情
        Result := DeletePath(mDirName + '\' + vSearchRec.Name);
        ...
        K := FindNext(vSearchRec);
      end;
      

  3.   

    我知道是用的递归,不过我看不出是怎么返回到上一级目录继续删除的
    假如我指定的文件夹是c:\1  如果在这个文件夹下还有一个目录2,而且2下面没有文件夹了,那就删除c:\1\2\下的所有的文件了,删除完之后怎么返回到c:\1下的呢
      

  4.   

    你要了解函数运行参数是通过堆栈传递的,要了解push和pop堆栈就明白了。一个最简单的算阶乘的递归算法,你看懂了就会明白的。function n(i:integer): integer;
    var
       j : integer;
    begin
         j := 1;
         if i > 0 then j := j * n(i-1)
         else Result := 1;
         Result := j;
    end;