delphi - Delphi中如何递归删除空目录

标签 delphi directory

父目录 D:\AAA 有 2 个子空目录 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不为空,然后将运行send round(递归方式), 删除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;

关于delphi - Delphi中如何递归删除空目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63592784/

相关文章:

ios - 在 Swift 中创建一个目录并将文件存储在其中

java - 使用文件 api : how to handle a directory containing 20000-30000 files? 读取目录

c++ - 如何使用 Windows 从 C++ 中的指定路径获取每个子目录和每个文件的大小?

sockets - TIdHttpServer和套接字超时

delphi - 打开Windows资源管理器目录,选择特定文件(在Delphi中)

google-maps - Delphi 的谷歌地图库突然停止工作?

java - 将图像写入java项目中的文件夹

javascript - 为 Javascript 重写根目录路径 "/"

delphi - 如何在 AContext.Connection.Disconnect 之后阻止 TCPServer OnExecute 事件无限执行?

Delphi - 如何检查方法变量?