用下面的函数就可以了,要引用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;
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;
===================================================
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;
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;