5

情况

我正在调试一些对目录路径执行一些存在性检查的遗留代码。首先,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. 之前网络上的文件访问存在问题,所以我的假设是(同样,这是遗留代码)引入它是为了在不可用时建立DirectoryPathB作为替代方案。DirectoryPathA我不知道为什么没有DriveInfo.IsReadyDirectoryPathB.

问题

即使DirectoryPathA是本地目录(所以没有网络中断),上面的代码偶尔会返回DirectoryPathB. 代码被执行了几次,并被假定为幂等的,但事实并非如此,这会破坏事情。这只会在几个小时内偶尔在某些机器上发生。我无法重现该问题。

假设驱动器状态在整个程序执行过程中永远不会改变,这是一个基本问题。我明白那个。然而,这段代码似乎大部分时间都很好,而且过去一直如此。

问题

DriveInfo.IsReady可能是什么原因false

该文件指出

true如果驱动器准备好了;false如果驱动器未准备好。

什么都不感谢。备注部分添加

IsReady 指示驱动器是否准备就绪。例如,它指示 CD 是否在 CD 驱动器中或可移动存储设备是否已准备好进行读/写操作。如果您不测试驱动器是否准备好,并且它还没有准备好,使用 DriveInfo 查询驱动器将引发 IOException。

  • 它不是可移动驱动器。我们说的是老生常谈C:\
  • 这不是权限问题,因为它有时适用,有时不适用于同一用户。
  • 这不是驱动器由于省电模式而变得不可用的问题,因为
    • 省电模式未激活并且
    • 这是一个SSD。

旧文档指出

线程安全

这种类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

DriveInfo.IsReady这是否意味着false其他线程同时在驱动器上执行某些操作?甚至有必要DriveInfo.IsReady为了true检查目录是否存在?

4

1 回答 1

0

我遇到了 Ntfs 文件系统损坏并触发了 Ntfs 事件 55 的情况。此时 DriveInfo.isReady() 返回 false。

于 2019-05-27T03:11:41.130 回答