uses FileCtrl;   procedure DelTree(const Directory: TFileName); 
  var 
    DrivesPathsBuff: array[0..1024] of char; 
    DrivesPaths: string; 
    len: longword; 
    ShortPath: array[0..MAX_PATH] of char; 
    dir: TFileName; 
  procedure rDelTree(const Directory: TFileName);
  var 
    SearchRec: TSearchRec; 
    Attributes: LongWord; 
    ShortName, FullName: TFileName; 
    pname: pchar; 
  begin 
    if FindFirst(Directory + '*', faAnyFile and not faVolumeID, 
       SearchRec) = 0 then begin 
      try 
        repeat // 检测所有的文件和目录
          if SearchRec.FindData.cAlternateFileName[0] = #0 then 
            ShortName := SearchRec.Name 
          else 
            ShortName := SearchRec.FindData.cAlternateFileName; 
          FullName := Directory + ShortName; 
          if (SearchRec.Attr and faDirectory) <> 0 then begin 
            // 是一个目录
            if (ShortName <> '.') and (ShortName <> '..') then 
              rDelTree(FullName + '\'); 
          end else begin 
            // 是一个文件
            pname := PChar(FullName); 
            Attributes := GetFileAttributes(pname); 
            if Attributes = $FFFFFFFF then 
              raise EInOutError.Create(SysErrorMessage(GetLastError)); 
            if (Attributes and FILE_ATTRIBUTE_READONLY) <> 0 then 
              SetFileAttributes(pname, Attributes and not 
                FILE_ATTRIBUTE_READONLY); 
            if Windows.DeleteFile(pname) = False then 
              raise EInOutError.Create(SysErrorMessage(GetLastError)); 
          end; 
        until FindNext(SearchRec) <> 0; 
      except 
        FindClose(SearchRec); 
        raise; 
      end; 
      FindClose(SearchRec); 
    end; 
    if Pos(#0 + Directory + #0, DrivesPaths) = 0 then begin 
      // 如果不是根目录,就删除
      pname := PChar(Directory); 
      Attributes := GetFileAttributes(pname); 
      if Attributes = $FFFFFFFF then 
        raise EInOutError.Create(SysErrorMessage(GetLastError)); 
      if (Attributes and FILE_ATTRIBUTE_READONLY) <> 0 then 
        SetFileAttributes(pname, Attributes and not 
          FILE_ATTRIBUTE_READONLY); 
      if Windows.RemoveDirectory(pname) = False then begin 
        raise EInOutError.Create(SysErrorMessage(GetLastError)); 
      end; 
    end; 
  end; 
  // ---------------- 
  begin 
    DrivesPathsBuff[0] := #0; 
    len := GetLogicalDriveStrings(1022, @DrivesPathsBuff[1]); 
    if len = 0 then 
      raise EInOutError.Create(SysErrorMessage(GetLastError)); 
    SetString(DrivesPaths, DrivesPathsBuff, len + 1); 
    DrivesPaths := Uppercase(DrivesPaths); 
    len := GetShortPathName(PChar(Directory), ShortPath, MAX_PATH); 
    if len = 0 then 
      raise EInOutError.Create(SysErrorMessage(GetLastError)); 
    SetString(dir, ShortPath, len); 
    dir := Uppercase(dir); 
    rDelTree(IncludeTrailingBackslash(dir)); 
  end; 
Sample calls 
------------ 删除 C:\TEMP\A123 目录
  DelTree('C:\TEMP\A123'); 使用方法:  DelTree('A:'); // or DelTree('A:\'); 

解决方案 »

  1.   

    procedure DelPath(DirName: string);
    var
      Sr: TSearchRec;
      PathName: string;
      k: Integer;
    begin
      PathName := DirName + '\*.*';
      k := FindFirst(PathName, faAnyFile, Sr);
      while k = 0 do
      begin
        if (Sr.Attr in [16, 16+1, 16+2, 16+4, 16+5, 16+32]) and (Pos(Sr.Name, '..') = 0) then
          begin
            Sr.Attr := 16;
            DelPath(DirName + '\' + Sr.Name);
          end
        else
          if Pos(Sr.Name, '..') = 0 then
          begin
            Sr.attr := 0;
            DeleteFile(PChar(DirName + '\' + Sr.Name));
          end;
        k := FindNext(Sr);
      end;
      RmDir(DirName);
    end;
      

  2.   

    哪里那么复杂哦?直接调用API函数SHFileOperation就可以了啊,有个SHFILEOPSTRUCT结构的东东,添上具体的值就可以了。
      

  3.   

    user ShellApi;procedure ToRecycle(AHandle: THandle; AFileName: string);
    var 
      SHFileOpStruct: TSHFileOpStruct;
    begin
      with SHFileOpStruct do
      begin
        Wnd := AHandle;
        wFunc := FO_DELETE;
        pFrom := PChar(AFileName);
        fFlags := FOF_ALLOWUNDO;
      end;
      SHFileOperation(SHFileOpStruct);
    end;
      

  4.   

    方法就是递归删除目录下的文件,删除这个目录其实何必模拟,ShellAPI 中就有一个函数(对不起我给忘了,只好你自己 find in help )
      

  5.   

    就是我说的那个答案啊,怎么还不给分,zswang和我说的是一样的啊。
      

  6.   

    哈哈,zswang有两个答案哦,我说得是第二个哈
      

  7.   

    //第三种
    uses ShellApi;function DoDelTree(mTreeName: string): Boolean;
    begin
      Result := ShellExecute(Application, 'Open',
        PChar(PChar('deltree')), PChar(Format('%s', [mTreeName])), nil, SW_SHOW) = 0;
    end;
      

  8.   

    function DoDelTree(mTreeName: string): Boolean;
    begin
      Result := ShellExecute(Application.Handle, 'Open',
        PChar(PChar('deltree')), PChar(Format('%s', [mTreeName])), nil, SW_SHOW) = 0;
    end;//如果win系统没有deltree.com就将deltree.old 改为deltree.com