什么原因会导致DriveInfo.IsReady为false?

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的额外保护。以前在网络上有文件访问问题,因此我的假设是(再次强调,这是旧代码),引入了这个保护来将DirectoryPathA 不可用时作为替代设置DirectoryPathB。我不知道为什么没有在DirectoryPathB上执行DriveInfo.IsReady的相应检查。

问题

即使DirectoryPathA是本地目录(因此没有网络故障),上述代码偶尔返回DirectoryPathB。代码被执行多次,并且被认为是幂等的,但实际上不是,这会导致问题的发生。 这种情况只会在几个小时内偶尔发生在某些机器上。我无法复现这个问题。

假设驱动器状态在程序执行期间永远不会发生改变存在基本问题。我明白这一点。但是,这段代码大部分时间似乎都很好,并且过去一直是这样。

问题

什么会导致DriveInfo.IsReadyfalse

文档说明了:

如果驱动器已准备好,则为true;如果驱动器未准备好,则为false

没啥用。备注部分补充说:

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

  • 这不是一个可移动驱动器。我们正在谈论普通的C:\
  • 这不是权限问题,因为同一用户有时可以正常工作,有时不能。
  • 这不是由于节能模式导致驱动器变得不可用的问题,因为:
    • 节能模式未激活,并且
    • 这是固态硬盘。
旧文档说明:

线程安全

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

这是否意味着如果另一个线程同时在驱动器上执行某些操作,DriveInfo.IsReady可能为false? 检查目录是否存在,DriveInfo.IsReady是否必须为true

我认为线程安全不是问题所在。这句话在所有类中都写得到处都是,除了那些完全线程安全的类。由于您每次都创建新实例,因此这实际上不可能是问题所在。 - PMF
1个回答

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接