目录.存在对时间敏感

本文关键字:时间 存在 目录 | 更新日期: 2023-09-27 18:35:39

我的应用程序中有以下代码:

if (!Directory.Exists(myPath))
    Directory.CreateDirectory(myPath);

如果我在常规单元测试中运行它,有时它会通过,有时不会。目录始终在那里(我确定它,因此从技术上讲,它永远不会被代码"创建")。但是每隔一段时间Directory.Exists(myPath)返回false,这使得代码尝试创建文件夹,然后我得到一个UnauthorizedAccessException

有趣的是,如果我在CreateDirectory上放一个断点,然后将黄色箭头向上移动以进行测试,则测试返回true

这是怎么回事?

myPath''nameOfLocalMachine'sharedFolder.该份额是可靠的并且不断使用...净 4.0

我刚刚做了一个小提琴手模拟 3000 个连续请求。 175 失败...所有这些都带有相同的消息:

对路径"'ameOfLocalMachine''sharedFolder''randomFileName.json"的访问被拒绝

目录.存在对时间敏感

这种事故在Windows上是很正常的。 程序在类似这样的目录上打开句柄并指定删除共享。 这允许任何人删除目录,即使程序正在使用它。 在关闭该句柄之前,该目录实际上不会从文件系统中消失。 接下来是尝试重新创建该目录不起作用,它仍然存在。 Windows 生成"拒绝访问"错误,该错误在 C# 程序中使用 UnauthorizedAccessException 报告。

虽然这听起来像是一个晦涩难懂的功能,但Windows中的每个程序这样做。 每个进程都有一个默认的工作目录,即 Environment.CurrentDirectory 的值。 在此类目录上创建句柄可确保它在程序使用它时不会消失。 还有其他情况,FileSystemWatcher将是另一个例子。 或者一个程序忙于迭代目录。 反恶意软件和搜索索引器因难以诊断此类错误的来源而臭名昭著。

否则是多任务操作系统的标准危害。 您不是唯一使用文件系统的人。 不重复删除和创建相同的目录应该在您的列表中排名很高。 如果这是绝对必要的,则在删除目录之前先重命名目录。 您仍然无法删除重命名的目录,但重新创建它不会失败。 您可以稍后删除它,下次需要执行此操作时。 那么麻烦的几率要低得多。 因为更多的时间过去了。