我在从软件中删除位于不同分区(E:/)上的文件夹时遇到了问题。我可以使用DeleteFile函数删除文件,但是我不能使用下面的代码删除文件夹:
function RemoveDirectory(strDir : String) : Boolean;
var
SearchRec : TSearchRec;
strFile : String;
nResult : Integer;
begin
try
Result := false;
nResult := FindFirst(strDir + '*', faAnyFile, SearchRec);
while (nResult = 0) do
begin
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
strFile := strDir + SearchRec.Name;
if FileExists(strFile) then
DeleteFile(strFile)
else if DirectoryExists(strFile) then
RemoveDirectory(strFile);
end;
nResult := FindNext(SearchRec);
end;
Result := RemoveDir(strDir);
finally
FindClose(SearchRec);
end;
end;
使用这段代码,我可以从我的软件中删除同一分区上的文件夹。有人知道发生了什么吗?是因为它在不同的分区上吗?
您正在尝试删除目录,而您仍然打开搜索句柄。由于这是一个递归函数,如果目录层次结构较深,您将同时打开多个搜索句柄,当到达较深的文件夹时,将使用大量系统资源。
最好将直接子文件夹收集到临时列表中,然后可以在迭代该列表之前关闭当前搜索句柄。这样,每次只有一个搜索句柄处于活动状态,并且在实际删除每个文件夹时没有搜索句柄处于活动状态。
试试这个:
function RemoveDirectory(strDir : String) : Boolean;
var
SearchRec : TSearchRec;
nResult,i : Integer;
SubFolders: TStringList;
begin
SubFolders := nil;
try
strDir := IncludeTrailingPathDelimiter(strDir);
nResult := FindFirst(strDir + '*', faAnyFile, SearchRec);
if (nResult = 0) then
try
repeat
if (SearchRec.Attr and faDirectory) = 0 then
DeleteFile(strDir + SearchRec.Name)
else
begin
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
if not Assigned(SubFolders) then SubFolders := TStringList.Create;
SubFolders.Add(strDir + SearchRec.Name);
end;
end;
until FindNext(SearchRec) <> 0;
finally
FindClose(SearchRec);
end;
if Assigned(SubFolders) then
begin
for i := 0 to SubFolders.Count-1 do
RemoveDirectory(SubFolders[i]);
end;
finally
SubFolders.Free;
end;
Result := RemoveDir(strDir);
end;
如果仍然失败,那么在你的app/循环之外的其他人实际上正在使用这些目录,你可以使用SysInternals Process Explorer之类的工具来检查。
DeleteFile()是布尔函数,您只能接收成功与否的信息。如果你想要更多的细节,返回到普通的Erase():
var f: file;
begin
AssignFile(f,strFile);
Erase(f);
end;
在这里,如果Erase()未完成,将引发一个异常,您可以收到更多信息,特别是在调试阶段。