情况
我正在调试一些旧代码,对目录路径进行了一些存在性检查。首先,检查DirectoryPathA
是否存在并返回。这应该是通常的情况。如果失败,则检查并返回DirectoryPathB
。(如果这也失败了,其他事情会发生,不是本问题的一部分)。以下是代码的样子:
if (!string.IsNullOrEmpty(DirectoryPathA))
{
driveInfo = new DriveInfo(DirectoryPathA);
if (driveInfo.IsReady)
{
dInf = new DirectoryInfo(DirectoryPathA);
if (dInf.Exists)
{
return DirectoryPathA;
}
}
}
if (!string.IsNullOrEmpty(DirectoryPathB))
{
dInf = new DirectoryInfo(DirectoryPathB);
if (dInf.Exists)
{
return DirectoryPathB;
}
}
如您所见,第一个检查使用了基于
DriveInfo.IsReady
的额外保护。以前在网络上有文件访问问题,因此我的假设是(再次强调,这是旧代码),引入了这个保护来将DirectoryPathA
不可用时作为替代设置DirectoryPathB
。我不知道为什么没有在DirectoryPathB
上执行DriveInfo.IsReady
的相应检查。
问题
即使DirectoryPathA
是本地目录(因此没有网络故障),上述代码偶尔返回DirectoryPathB
。代码被执行多次,并且被认为是幂等的,但实际上不是,这会导致问题的发生。
这种情况只会在几个小时内偶尔发生在某些机器上。我无法复现这个问题。
假设驱动器状态在程序执行期间永远不会发生改变存在基本问题。我明白这一点。但是,这段代码大部分时间似乎都很好,并且过去一直是这样。
问题
什么会导致DriveInfo.IsReady
为false
?
文档说明了:
如果驱动器已准备好,则为
true
;如果驱动器未准备好,则为false
。
没啥用。备注部分补充说:
IsReady指示驱动器是否已准备就绪。例如,它指示CD驱动器中是否有CD或可移动存储设备是否就绪进行读/写操作。如果您未测试驱动器是否可用且该驱动器不可用,则使用DriveInfo查询驱动器将引发IOException。
- 这不是一个可移动驱动器。我们正在谈论普通的
C:\
。 - 这不是权限问题,因为同一用户有时可以正常工作,有时不能。
- 这不是由于节能模式导致驱动器变得不可用的问题,因为:
- 节能模式未激活,并且
- 这是固态硬盘。
这是否意味着如果另一个线程同时在驱动器上执行某些操作,线程安全
此类型的任何公共静态成员(在 Visual Basic 中为 Shared)都是线程安全的。不保证所有实例成员都是线程安全的。
DriveInfo.IsReady
可能为false
?
检查目录是否存在,DriveInfo.IsReady
是否必须为true
?