功能:递归算法实现DOS命令deltree的功能出现问题如下:
被删除的目录下文件以及子目录的文件可以被删除,可子文件夹不能删除,哪位高手可以教我哪里错了
代码如下:
Button1Click为开始删除按钮procedure TForm1.Button1Click(Sender: TObject);
begin
  //删除d:\bb\文件夹下的所有内容
  deltree('d:\bb\');
end ;function tform1.deltree(path:string):boolean;
var
  SearchRec: TSearchRec;
  olddir: string;
  i:integer;
begin
  //判断目录是否存在
  if DirectoryExists(path) then
  begin
    //进入该目录,删除其中的子目录和文件
    oldDir := GetCurrentDir;
    ChDir(path);
    //查找目录中所有任何文件
    FindFirst('*.*', faAnyFile, SearchRec);    repeat
    //修改文件属性为普通属性值
    FileSetAttr(SearchRec.Name,0);
    //如果是目录并且不是.和..则递归调用DelTree
    if(SearchRec.Attr and faDirectory > 0) then
    begin
      if(SearchRec.Name[1]<> '.') then
        if(not Deltree(SearchRec.Name)) then
          break;
    end
    else
    //如果是文件直接删除
      if(not DeleteFile(SearchRec.Name))then
        break ;
    //继续查找,直到最后
    until (FindNext(SearchRec)<> 0) ;    //回到父目录,删除该目录
    chdir('..');
    showmessage(getcurrentdir);
    showmessage(path);
    result:=removedir(path);
    SetCurrentDir(oldDir);
  end
  else
    Result := False ;
end ;

解决方案 »

  1.   

    这是一个搜索文件的例子,你可以从中得到启发:
    procedure tform1.deltree(path:string);
    var
      MyResult: integer;
      NewPath: string;
      FSearchRec, DSearchRec: TSearchRec;
    begin
      //判断目录是否存在
      if DirectoryExists(path) then
      begin
        NewPath := Path;
        MyResult := FindFirst(Path+'\*.*', faAnyfile, FsearchRec);
        while MyResult = 0 do
        begin
          if (FSearchRec.Name <> '.') and (FSearchRec.Name <> '..') then
          begin
            listbox1.Items.Add(FSearchRec.Name);
            DeleteFile(Path+'\'+FSearchRec.Name);
          end;
          MyResult := FindNext(FSearchRec);
        end;    MyResult := findFirst(path+'\*.*', faDirectory, DSearchRec);
        while MyResult = 0 do
        begin
          if (DSearchRec.Name <> '.') and (DSearchRec.Name<> '..') then
          begin
            NewPath := Path;
            path := path + '\'+DSearchRec.Name;
            Deltree(Path);
          end;
          path := NewPath;
          MyResult := FindNext(DSearchRec);
        end;
      end;
    end;
      

  2.   

    又查了一下,你的程序应该少了一句话, 如果你的程序能够正常运行的话:
    FindClose(SearchRec);