【发布时间】:2018-12-11 10:59:46
【问题描述】:
情况
我正在调试一些对目录路径执行一些存在性检查的遗留代码。首先,检查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 作为替代方案。我不知道为什么没有对DriveInfo.IsReady 进行这样的检查DirectoryPathB。
问题
即使DirectoryPathA 是本地目录(因此不会出现网络中断),上面的代码偶尔会返回DirectoryPathB。代码被执行了几次,并被假定为幂等的,但事实并非如此,这会破坏事情。
这只是在几个小时内偶尔在某些机器上发生。我无法重现该问题。
驱动器状态在整个程序执行过程中永远不会改变的假设存在一个根本问题。我明白那个。但是,这段代码似乎大部分时间都很好,而且过去一直如此。
问题
什么会导致DriveInfo.IsReady 成为false?
文档说明
true如果驱动器准备好了;false如果驱动器未准备好。
什么都不感谢。备注部分添加
IsReady 指示驱动器是否准备就绪。例如,它指示 CD 是否在 CD 驱动器中或可移动存储设备是否已准备好进行读/写操作。如果您不测试驱动器是否准备好,并且它还没有准备好,使用 DriveInfo 查询驱动器将引发 IOException。
- 它不是可移动驱动器。我们说的是老旧的
C:\。 - 这不是权限问题,因为它有时对同一用户有效,有时则无效。
- 这不是驱动器由于省电模式而变得不可用的问题,因为
- 省电模式未启用并且
- 这是一个 SSD。
线程安全
这种类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
这是否意味着如果其他线程同时在驱动器上执行某些操作,DriveInfo.IsReady 可能是false?
DriveInfo.IsReady 是否需要 true 才能检查目录是否存在?
【问题讨论】:
-
我不认为线程安全是这里的问题。对于所有类除了那些完全线程安全的类,这个确切的句子到处都是。由于您每次都在创建新实例,因此这并不是真正的问题。
标签: c# directory drive contention filesystem-access