如题,谢谢!

解决方案 »

  1.   

    用下面的函数就可以了,要引用ShellAPI单元。
    ===================================================
    uses ShellAPI;
    function DelDirectory(const Source:string): boolean;
    var
      fo: TSHFILEOPSTRUCT;
    begin
      FillChar(fo, SizeOf(fo), 0);
      with fo do
      begin
        Wnd := 0;
        wFunc := FO_DELETE;
        pFrom := PChar(source+#0);
        pTo := #0#0;
        fFlags := FOF_NOCONFIRMATION+FOF_SILENT;
      end;
      Result := (SHFileOperation(fo) = 0);
    end;
      

  2.   

    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
                // It's a file
                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;