当目录被empy时,出现 "目录不空 "的错误。

问题描述 投票:1回答:1

我在尝试从c#代码中删除一个目录时,出现了一个非常断断续续的 "目录不为空 "的错误,但是当我查看时,这个目录似乎是空的。

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

我想知道,当你有两个进程以这种方式合作时,进程B的删除调用还没有完全刷新到文件系统中,是否有可能出现NTFS的race Condition?

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

c# .net windows ntfs
1个回答
4
投票

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

  • 特别麻烦的是那种打开文件的进程,它的方式并不妨碍你删除文件,但仍然使删除目录失败,出现这种错误。 搜索索引器和反恶意软件符合这一类。 它们会在.NET程序中用删除共享、FileShare.Delete打开文件。 删除文件工作正常。 但是在他们关闭文件句柄之前,文件不会消失。 所以在他们没有删除之前,你是无法删除目录的。

  • 非常难诊断的是一个进程将该目录选择为当前工作目录。 .NET程序中的Environment.CurrentDirectory。 资源管理器往往会触发这种情况,只要看一下目录就足以防止它被删除。

这些事故的发生完全不受你的控制。 你 需要处理它们,需要捕捉异常。 你可以通过稍后再试一次来做的事情很少,然而你需要等待的时间是没有上限的。 重命名目录,并给它起一个 "垃圾桶 "的名字是一个不错的策略。 请注意,Windows中的回收站基本上也是按照这个方案来做的,好的不仅仅是回收:)

© www.soinside.com 2019 - 2024. All rights reserved.