【发布时间】:2014-07-31 12:20:23
【问题描述】:
从我的软件中删除位于不同分区 (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;
使用此代码,我可以从我的软件中删除位于同一分区上的文件夹。有人知道发生了什么吗?是不是因为它在不同的分区上?
【问题讨论】:
-
在调试器中单步执行代码时会发生什么?您是否检查任何错误/返回值或引发任何异常?这些都将帮助您解决问题。
-
文件是否在同一个映射驱动器上并不重要。有些东西阻止你删除文件/目录。您没有检查错误的事实是一个令人担忧的迹象。如果你想知道哪里出了问题,为什么你忽略了检查错误?为什么要使用
FileExists和DirectoryExists?SearchRec.Attr告诉你这些信息。你的try/finally也全错了。try太快了。下一步是添加错误检查。 -
可以手动删除这些目录吗?
-
好的,我添加了错误检查并得到错误32,这表明某些进程正在使用它。但是如果我在这个函数之前放一个睡眠,然后我自己去,我可以手动删除文件夹。所以我认为保存文件夹的是函数本身。 PS:该目录内的所有文件(里面没有文件夹)都被成功删除了。
-
我注意到您在
FindClose(SearchRec);之前致电Result := RemoveDir(strDir)。我不会肯定地说这是你的问题,(你应该注意有关错误处理的警告)但它仍然让我觉得从后到前。