从我的软件中删除不同分区(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;
使用此代码,我可以从我的软件中删除同一分区上的文件夹。有人知道发生了什么事吗?是因为它在不同的分区上吗?
答案 0 :(得分:4)
您仍尝试在仍有打开的搜索句柄时删除目录。由于这是一个递归函数,如果目录层次结构较深,则一次打开多个搜索句柄,这是在到达更深文件夹时使用的大量系统资源。
最好将直接子文件夹收集到临时列表中,然后在迭代该列表之前关闭当前搜索句柄。这样,一次只有一个搜索句柄处于活动状态,并且在实际删除每个文件夹时没有活动的搜索句柄。
试试这个:
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 / loop之外的其他人实际上正在使用这些目录,您可以使用SysInternals Process Explorer之类的工具来检查。
答案 1 :(得分:-2)
DeleteFile()是布尔函数,只有成功与否才能收到信息。如果您想要更多详细信息,请返回普通的Erase():
var f: file;
begin
AssignFile(f,strFile);
Erase(f);
end;
此处,如果Erase()未完成,将引发异常,您可以收到更多信息,尤其是在调试阶段。