我的应用程序中有以下代码:
if (!Directory.Exists(myPath))
Directory.CreateDirectory(myPath);
如果我在常规单元测试中运行它有时它通过,有时不通过。目录总是在那里(我确定了它,所以从技术上讲,它永远不会是#34;通过代码创建")。但偶尔Directory.Exists(myPath)
会返回false
,这会让代码尝试创建文件夹,然后我会得到UnauthorizedAccessException
!
这里有趣的是,如果我在CreateDirectory
上放置断点,然后将黄色箭头向上移动进行测试,则测试返回true
!
发生了什么?
myPath
是\\nameOfLocalMachine\sharedFolder
。该份额是可靠的并且经常使用...... .NET 4.0
我只是做了一个小提琴模拟3000个顺序请求。 175失败......所有人都有同样的信息:
访问路径' \ nameOfLocalMachine \ sharedFolder \ randomFileName.json'被拒绝
答案 0 :(得分:3)
这种不幸在Windows上非常正常。程序在这样的目录上打开句柄并指定删除共享。这允许任何人删除目录,即使程序正在使用它。在该句柄关闭之前,该目录实际上不会从文件系统中消失。接下来是尝试重新创建该目录无法工作,它仍然存在。 Windows会生成"访问被拒绝"错误,在您的C#程序中使用UnauthorizedAccessException报告。
虽然这听起来像一个不起眼的功能,但 Windows中的每个程序都会这样做。每个进程都有一个默认的工作目录,即Environment.CurrentDirectory的值。在这样的目录上创建句柄可确保它在程序使用时不会消失。还有其他情况,FileSystemWatcher将是另一个例子。或者程序忙于迭代目录。反恶意软件和搜索索引器因难以诊断此类错误的来源而臭名昭着。
否则是多任务操作系统的标准危险。您不是唯一使用该文件系统的人。不重复删除和创建相同的目录应该在列表中非常高。如果这是绝对必要的,那么在删除之前首先重命名目录。您仍然无法删除重命名的目录,但您无法重新创建它。您可以在以后需要执行此操作时将其删除。那么麻烦的几率要低得多。因为更多的时间过去了。