gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:18:45 26 4
gpt4 key购买 nike

我在尝试从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com