问题描述
父目录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');