如何在Delphi中递归删除空目录

问题描述

父目录D:\ AAA有两个子目录D:\ AAA \ BB1和D:\ AAA \ BB2 我的要求是如何递归删除空目录。 这是互联网上的两个功能,如下所示: //递归删除空目录

function RemoveEmptyDirectory(path: string) : Boolean;
var
  MySearch: TSearchRec;
  Ended: Boolean;
begin
  if FindFirst(path + '\*.*',faDirectory,MySearch) = 0 then
  begin
    repeat
      if ((MySearch.Attr and faDirectory) = faDirectory) and
        (MySearch.Name[1] <> '.') then
      begin
        if DirectoryIsEmpty(path + '\' + MySearch.Name) then
          TDirectory.Delete(path + '\' + MySearch.Name)
        else
        begin
          RemoveEmptyDirectory(path + '\' + MySearch.Name);
          if DirectoryIsEmpty(path + '\' + MySearch.Name) then
            RemoveEmptyDirectory(path + '\' + MySearch.Name);
        end;
      end;
    until FindNext(MySearch) <> 0;
    FindClose(MySearch);
  end;
end;

//检查目录是否为空

function DirectoryIsEmpty(Directory: string): Boolean;
var
  SR: TSearchRec;
  i: Integer;
begin
  Result := False;
  FindFirst(IncludeTrailingPathDelimiter(Directory) + '*',faAnyFile,SR);
  for i := 1 to 2 do
    if (SR.Name = '.') or (SR.Name = '..') then
      Result := FindNext(SR) <> 0;
  FindClose(SR);
end;

我的问题在这里:首先运行功能RemoveEmptyDirectory将发现D:\ AAA不为空,然后将运行发送回合(递归方式), 删除2个子目录D:\ AAA \ BB1和D:\ AAA \ BB2之后,父目录将成为一个空目录, 回到第一轮,函数DirectoryIsEmpty报告父目录不是一个空目录!!! 为什么!!!! Windows系统仍然不会更改目录状态吗?

那么,有什么好的建议可以满足我的要求。

解决方法

从不检查 D:\AAA本身。

只需进行最后的检查和删除即可

function RemoveEmptyDirectory(path: string) : Boolean;
var
  MySearch: TSearchRec;
  Ended: Boolean;
begin
  if FindFirst(path + '\*.*',faDirectory,MySearch) = 0 then
  begin
    repeat
      if ((MySearch.Attr and faDirectory) = faDirectory) and
        (MySearch.Name[1] <> '.') then
      begin
        if DirectoryIsEmpty(path + '\' + MySearch.Name) then
          TDirectory.Delete(path + '\' + MySearch.Name)
        else
        begin
          RemoveEmptyDirectory(path + '\' + MySearch.Name);
          if DirectoryIsEmpty(path + '\' + MySearch.Name) then
            RemoveEmptyDirectory(path + '\' + MySearch.Name);
        end;
      end;
    until FindNext(MySearch) <> 0;
    FindClose(MySearch);
  end;

  if DirectoryIsEmpty(path) then
    TDirectory.Delete(path);

end;
,

您可以将TDirectory用作

TDirectory.Delete('D:\AAA',True);

如果您需要检查目录是否为空,则可以使用TDirectory.GetDirectories()作为

Var
  S: string;
begin
  for S in TDirectory.GetDirectories('D:\AAA','*',TSearchOption.soAllDirectories) do
    begin
      if TDirectory.IsEmpty(S) then
        TDirectory.Delete(S);
    end;
  If TDirectory.IsEmpty('D:\AAA') then
    TDirectory.Delete('D:\AAA');