c# - 目录为空时报错 "The directory is not empty."

标签 c# .net windows ntfs

我在尝试从 C# 代码中删除目录时遇到非常间歇性的“目录不为空”错误,但当我查看时,该目录似乎是空的。

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

我想知道当您有两个进程以这种方式协作时,是否存在与 NTFS 的竞争条件,其中进程 B 的删除调用尚未完全刷新到文件系统?

当然,更明显的答案是该目录当时确实不为空,在我查看它之前其他东西清空了它,但我不明白这怎么会发生在我当前的应用程序中,因为没有其他进程这将删除文件。

最佳答案

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

  • 特别麻烦 - 有些进程打开文件的方式不会阻止您删除文件,但仍然会导致删除目录失败并出现此错误。搜索索引器和反恶意软件属于这一类。他们将使用 .NET 程序中的删除共享 FileShare.Delete 打开文件。删除文件工作正常。但是文件不会消失,直到他们关闭文件句柄。因此,在他们删除目录之前,您不能删除该目录。

  • 很难诊断将目录选为其当前工作目录的进程。 .NET 程序中的 Environment.CurrentDirectory。资源管理器往往会触发此操作,只需查看目录就足以防止它被删除。

这些事故的发生完全超出了您的控制范围。您需要处理它们,捕获异常是必需的。稍后再试几乎无能为力,但是您需要等待的时间没有上限。重命名目录并给它一个“垃圾”名称是一个很好的策略。请注意 Windows 中的回收站基本上遵循这种情况,它不仅仅用于回收 :)

关于c# - 目录为空时报错 "The directory is not empty.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23080837/

相关文章:

c# - 在 c# .net 中将文本框动态添加到数据绑定(bind)复选框列表

c - 如何检查内存是否可用于读/写操作?

c# - 如果我有一个自定义对话框窗口,每次都可以创建一个新对话框吗?

c# - 为什么 NHibernate 不能在每个具体类映射的联合子类表中使用标识?

c# - 寻找类似 HashSet 的东西,但具有一系列键值?

c# - 使用 MEF 时是否有任何 Prism "Post-build"事件或方法?

c# - 如何检查字符串是否包含从 a 到 z 的任何字母?

c - Windows 中的生成文件

c# - 在 C# 中组合多个条件表达式

c# - 如果 T 发生变化,则从 List<T> 中移除所有项目