//想写个函数删除一个文件夹,递归删除文件中的文件,然后把文件夹remove掉,
//但是现在发现用了findfirst,findnext查找删除文件后,remove文件夹始终不成功。(文件夹已经为空了)
//不知道是什么原因。
function deldir(ADir:string;bLeaveADir:boolean=false;bLeaveAllDir:boolean=false):boolean;
var
  sr:tsearchrec;
  i:integer;
begin
  result:=false;
  if not directoryexists(ADir) then exit;
  if ADir[length(ADir)]<>'\' then
    ADir:=ADir+'\';  //********对一个文件夹下所有文件的操作***********
  if findfirst(ADir+'*.*',faanyfile,sr)=0 then
    begin
      repeat
        if sr.Attr and fadirectory =0 then //是文件
          result:=deletefile(ADir+sr.Name)
        else if (sr.Name<>'.') and (sr.Name<>'..') then   //对本文件夹,上层文件夹不操作。
          result:=deldir(ADir+sr.Name,bLeaveAllDir,bLeaveAllDir);
        if (sr.Name<>'.') and (sr.Name<>'..') and (result=false) then exit;
      until findnext(sr)<>0
    end;
  //***************************
  if not bLeaveADir then
    result:=removedir(ADir);
end;

解决方案 »

  1.   

    removedir 只能删除空文件夹
      

  2.   

    procedure TfrmMain.btnDeleteClick(Sender: TObject);
    var
        T:TSHFileOpStruct;
        P:String;
    begin
        P:=edtPath.Text;
        with T do
        begin
            Wnd:=0;
            wFunc:=FO_DELETE;
            pFrom:=Pchar(P);
            fFlags:=FOF_ALLOWUNDO
        end;
        if SHFileOperation(T)=0 then
            ShowMessage('删除成功')
        else
            ShowMessage('删除失败');
    end;删除文件或文件夹到回收站。
      

  3.   

    var
    FileStruct : SHFILEOPSTRUCT;        FileStruct.Wnd := Handle;
            FileStruct.wFunc := FO_DELETE;
            FileStruct.pFrom := pChar(sPath); //文件夹
            FileStruct.pTo := '';  //pChar(InstallPath);
            FileStruct.fFlags := FOF_NOCONFIRMATION;
            FileStruct.fAnyOperationsAborted := False;
            FileStruct.hNameMappings := nil;
            FileStruct.lpszProgressTitle := '';
            SHFileOperation(FileStruct);
      

  4.   

    uses shellapi
    添加一个edit,一个button,你试试,为什么要那么麻烦呢。
    这个根据fflags的值不同,有不同的操作。
      

  5.   

    if ADir[length(ADir)]<>'\' then
        ADir:=ADir+'\';  //删文件夹时,不要追加"\"
    ...................................
    ...................................
    ...................................
      if not bLeaveADir then
        result:=removedir(ADir);
    end;
      

  6.   

    Idle_(阿呆)
    嗯,用了findclose后确实可以了