2014-04-15 64 views
1

我得到一个非常间歇性的“目录不空”错误试图从c#代码中删除目录,但是当我看,目录似乎是空的。错误“目录不为空。”当目录是empy

实际情况是这样的:进程A使用同步.Net远程调用调用进程B,进程B从目录中删除文件,然后返回到进程A删除目录本身。该磁盘是本地连接的NTFS磁盘(可能是SATA)。

我想知道是否有可能的竞争条件与NTFS,当你有两个进程合作在这种方式,其中进程B的删除调用没有完全刷新到文件系统?

当然,更明显的答案是当前目录真的不是空的,而其他东西在我看它之前就清空了,但我没有看到在当前应用程序中会发生这种情况,因为没有其他的过程会删除文件。

+0

您是否尝试过使用'Directory.Delete(target_dir,true);'来递归移除目录和所有文件? – chridam

+0

你有没有试过用删除键删除它? –

+0

@Weyland,对不起,我应该明确说明,是的,我买它的时间,删除它没有问题 – Andy

回答

4

当然,删除目录在多任务操作系统上是一个危险的冒险。您总是有另一个进程打开文件的风险。如果不删除该目录在你的方案有两个主要的原因:

  • 特别麻烦,有些是打开的文件,它不会阻止你删除文件的方式,但仍是一种过程,使删除目录失败并出现此错误。搜索索引器和反恶意软件适合这个类别。他们将使用.NET程序中的删除共享FileShare.Delete打开文件。删除文件工作正常。但是文件在关闭文件句柄之前不会消失。所以你不能删除目录,直到他们这样做。

  • 很难诊断的是一个进程将目录选作当前工作目录。 Environment.CurrentDirectory在.NET程序中。资源管理器往往会触发这一点,只要查看目录就足以防止它被删除。

这些事故完全发生在您的控制之外。你需要处理它们,捕捉异常是必需的。稍后您可以再试一次,但是您不得不等待多长时间才能达到上限。重命名目录并给它一个“垃圾”名称是一个好策略。注意Windows中的回收站基本上遵循这种情况,不仅仅是回收利用:)

+0

谢谢,我将调查这样的想法,即搜索索引器或可能的备份程序已经设法锁定文件。我得到的错误并不是目录被锁定(如果一个进程将它设置为CWD),但我可以肯定地看到,可能存在某种访问模式会导致我的症状。我们已经发现了异常,并且我们仍然使用垃圾名称(这只是一个临时文件),所以它不会给我们带来很大的麻烦,只是有兴趣尝试去找到它的底部。 – Andy