各位朋友,Delphi函数如下:该函数可以将每个目录(包含子目录)下的所有文件删除,但不能将每个目录删除,不知错在哪里,希望朋友们能指出,多谢!
function TForm1.DoRemoveDir(sDirName: string): Boolean;
var
  hFindFile: Cardinal;
  tfile: string;
  sCurDir: string;
  bEmptyDir: Boolean;
  FindFileData: WIN32_FIND_DATA;
begin
//如果删除的是空目录,则置bEmptyDir为True
//初始时,bEmptyDir为True
  bEmptyDir := True;
//先保存当前目录
  sCurDir := GetCurrentDir;
  SetLength(sCurDir, Length(sCurDir));
  ChDir(sDirName);
  hFindFile := FindFirstFile('*.*', FindFileData);
  if hFindFile <> INVALID_HANDLE_VALUE then
    begin
      repeat
        tfile := FindFileData.cFileName;
        if (tfile = '.') or (tfile = '..') then
          begin
            bEmptyDir := bEmptyDir and True;
            Continue;
          end;
//不是空目录,置bEmptyDir为False
        bEmptyDir := False;
        if FindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
          begin
            if sDirName[Length(sDirName)] <> '\' then
              DoRemoveDir(sDirName + '\' + tfile)
            else
              DoRemoveDir(sDirName + tfile);
            if not RemoveDirectory(PChar(tfile)) then
              result := false
            else
              result := true;
          end
        else
          begin
            if not DeleteFile(PChar(tfile)) then
              result := false
            else
              result := true;
          end;
      until FindNextFile(hFindFile, FindFileData) = false;
   //   FindClose(hFindFile);
    end
  else
    begin
      ChDir(sCurDir);
      result := false;
      exit;
    end;
//如果是空目录,则删除该空目录
  if bEmptyDir then
    begin
//返回上一级目录
      ChDir('..');
//删除空目录
      RemoveDirectory(PChar(sDirName));
    end;
 //回到原来的目录下
  ChDir(sCurDir);
  result := true;
end;

解决方案 »

  1.   

    你的要求可以使用这个函数
    function TForm1.DoRemoveDir(sDirName: string): Boolean;
    var
      OpStruc:TSHFileOpStruct;
      FromBuf:Array[0..128] of Char;
    begin
      FillChar(FromBuf,Sizeof(FromBuf),0);
      StrPCopy(FromBuf,Pchar(sDirName));
      //开始填充OpStruc记录
      with OpStruc do
      begin
        Wnd:=Handle;
        wFunc:=FO_DELETE;
        pFrom:=@FromBuf;
        pTo:=nil;
        fFlags:=FOF_NOCONFIRMATION;
        lpszProgressTitle:='正在删除';
      end;
      if SHFileOperation(OpStruc)=0 then
      //执行成功
      MessageBox(Handle,'删除完毕。','删除信息',MB_OK+MB_ICONINFORMATION);
    end;
      

  2.   

    procedure DeleteDir(DirName : String);
    var
      DirInfo : TSearchRec;
      i : Integer;
      tmp : string;
    begin
      i := FindFirst(DirName + '\*.*', faAnyFile ,DirInfo);
      while i = 0 do
      begin
        if DirInfo.Attr and favolumeid = 0 then
        begin
          tmp := dirname + '\' + DirInfo.Name;
          if DirInfo.Attr and fadirectory = 0  then DeleteFile(PChar(tmp))
          else
          if (dirinfo.name <> '..') and (DirInfo.Name <> '.') then Deletedir(tmp);
          i := findnext(DirInfo);
        end;
      end;
      RemoveDir(Dirname);
      SysUtils.FindClose(DirInfo);
    end;
      

  3.   

    文件夹不是空的, RemoveDirectory删除不了
      

  4.   

    首先感谢上面的几位朋友的热心回复,另外,想请教一下,defuse大哥,你的代码是啥意思,不是看得很明白,还请赐教!
    procedure TForm1.DeleteDir(DirName: string);
    var
      DirInfo: TSearchRec;
      i: Integer;
      tmp: string;
    begin
      i := FindFirst(DirName + '\*.*', faAnyFile, DirInfo);
      while i = 0 do//问题1:这句话的意思,是不是说“当找到文件的时候就。”
        begin
          if DirInfo.Attr and favolumeid = 0 then//问题2:DirInfo.Attr and favolumeid = 0这句是啥意思?
            begin
              tmp := dirname + '\' + DirInfo.Name;
              if DirInfo.Attr and fadirectory = 0 then DeleteFile(PChar(tmp))//问题3:DirInfo.Attr and fadirectory = 0是啥意思?
              else
                if (dirinfo.name <> '..') and (DirInfo.Name <> '.') then Deletedir(tmp);
              i := findnext(DirInfo);
            end;
        end;
      FindClose(DirInfo);
      RemoveDir(Dirname);
    end;
    //问题4:为什么要(dirinfo.name <> '..') and (DirInfo.Name <> '.') then 
    //问题5: if (dirinfo.name <> '..') and (DirInfo.Name <> '.') then Deletedir(tmp);整句又是啥啥意思,始终不是很明白,如何递归调用这个删除的过程的?它的执行过程能否再形象一点呢?
      

  5.   


    findfirst
    FindFirst returns 0 if a file was successfully located, otherwise, it returns an error code.findnext
    the return value is zero if the function was successful. Otherwise the return value is an error code.问题一:是的,找到任何文件或文件夹
    问题二:不是盘符(如: c:\)
    问题三:不是文件夹(这时删除文件)
    问题四:..上层目录,.本目录(如果不加这个判断的话,执行一下,要删除的目录外面的东西都删掉了)
    问题五:是文件夹,且文件夹不是‘..’‘.’,递归首先路径下找文件或文件夹,是文件则删除,是目录则递归,找下一个,最后删除空文件夹。
      

  6.   

    楼主,不管你用什么方法,没有比这个更快的了,而且不会出错.
    你的要求可以使用这个函数
    function TForm1.DoRemoveDir(sDirName: string): Boolean;
    var
      OpStruc:TSHFileOpStruct;
      FromBuf:Array[0..128] of Char;
    begin
      FillChar(FromBuf,Sizeof(FromBuf),0);
      StrPCopy(FromBuf,Pchar(sDirName));
      //开始填充OpStruc记录
      with OpStruc do
      begin
        Wnd:=Handle;
        wFunc:=FO_DELETE;
        pFrom:=@FromBuf;
        pTo:=nil;
        fFlags:=FOF_NOCONFIRMATION;
        lpszProgressTitle:='正在删除';
      end;
      if SHFileOperation(OpStruc)=0 then
      //执行成功
      MessageBox(Handle,'删除完毕。','删除信息',MB_OK+MB_ICONINFORMATION);
    end;
    以上有楼主也讲了