【发布时间】:2017-03-15 12:09:57
【问题描述】:
我观察到在调用 TDirectory.Delete(x) 后立即调用 DirectoryExists(x) 如果要删除的文件夹中的文件很少并且该文件夹处于打开状态(在 Total Commander 中),则返回 true。
换句话说:
begin
TDirectory.Delete('x', true); <-- 'Delete' exited but the folder is still not fully deleted
if SysUtils.DirectoryExists('x')... <-- This returns true
end;
这是正常行为吗?
“解决方案”是这样的:
begin
TDirectory.Delete('x', true);
Sleep(1000); //wait for Delete to finish
if SysUtils.DirectoryExists('x')...
end;
问题:我如何知道 Delete 何时准备就绪(如何消除睡眠)?
注意:Total Commander 不会阻止删除文件夹(我猜),因为文件夹无论如何都会被删除(一段时间后)。
【问题讨论】:
-
@NAZCA:是的,我明白这一点,我只是对“你为什么……”的评论感到困惑。
-
如果您打算清空一个文件夹,您可以为每个目录调用
TDirectory.GetDirectories和TDirectory.Delete。然后致电TDirectory.GetFiles并将它们全部删除。这样可以节省您创建已经存在的目录的时间。现在您不再需要拨打DirectoryExists了。是的,您需要输入更多代码,但它可以满足您的需求。 -
你要做什么?您是否想要一个有效的程序,或者您想反对 MS 设计系统的方式。照@R.Beiboer 所说的去做。
-
也许 msdn 页面上关于 RemoveDirectory 的备注部分给了我们一个线索? (msdn.microsoft.com/en-us/library/windows/desktop/…) RemoveDirectory 函数将目录标记为在关闭时删除。因此,在关闭目录的最后一个句柄之前不会删除该目录。这表明调用可能会在目录实际被删除之前返回。
-
@R.Beiboer - 谢谢。这为这个问题提供了一些启示。它还确认 Delete 是异步的(在 Embarcadero 的手册中没有提到)。这意味着所有使用 Delete 的代码都应该使用延迟来防止此类问题? PS:如果你发布它,我会接受你的回答。
标签: delphi delphi-xe7