uses SysUtils, Classes; function DeleteEmptyDir(const Path: String): Boolean; var Index: Integer; DirNames: TStringList; SearchRec: TSearchRec; begin Result := True; if Path = '' then begin Exit; end; DirNames := nil; try DirNames := TStringList.Create; { Search } if FindFirst(IncludeTrailingPathDelimiter(Path) + '*.*',faAnyFile,SearchRec) = 0 then begin try repeat if (SearchRec.Name = '.') or (SearchRec.Name = '..') then begin Continue; end; if (SearchRec.Attr and faDirectory) <> 0 then begin DirNames.Add(IncludeTrailingPathDelimiter(Path) + SearchRec.Name); end else begin Result := False; end; until (FindNext(SearchRec) <> 0); finally FindClose(SearchRec); end; end; { Delete sub directories } for Index := 0 to DirNames.Count - 1 do begin if DeleteEmptyDir(DirNames.Strings[Index]) = True then begin { Delete } if RemoveDir(DirNames.Strings[Index]) = False then begin RaiseLastOSError; end; end else begin Result := False; end; end; finally DirNames.Free; end; end;
最初に指定したディレクトリは削除されません。戻値がTrueであれば削除可能(指定したディレクトリの下がすべて削除された)であることを示します。