C# 什么原因导致DriveInfo.IsReady为false? 处境

C# 什么原因导致DriveInfo.IsReady为false? 处境,c#,directory,drive,contention,filesystem-access,C#,Directory,Drive,Contention,Filesystem Access,我正在调试一些遗留代码,这些代码对目录路径执行一些存在性检查。首先,检查并返回目录路径a(如果存在)。这应该是通常的情况。如果失败,则检查并返回DirectoryPathB。(如果这也失败了,就会发生其他事情,而不是这个问题的一部分)。下面是代码的外观: if (!string.IsNullOrEmpty(DirectoryPathA)) { driveInfo = new DriveInfo(DirectoryPathA); if (driveInfo.IsReady)

我正在调试一些遗留代码,这些代码对目录路径执行一些存在性检查。首先,检查并返回目录路径a(如果存在)。这应该是通常的情况。如果失败,则检查并返回
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;
    }
}
正如您所看到的,第一个检查有一个基于的附加保护。以前网络上的文件访问存在问题,因此我的假设是(同样,这是遗留代码),引入此选项是为了在
DirectoryPathA
不可用的情况下建立
DirectoryPathB
。我不知道为什么在
DirectoryPathB
上没有对
DriveInfo.IsReady
执行此类检查

问题 即使
DirectoryPathA
是本地目录(因此没有网络中断),上面的代码也会偶尔返回
DirectoryPathB
。代码被执行多次,并被假定为幂等的,而不是幂等的,这会破坏事物。 这种情况仅在某些机器上偶尔发生,持续数小时。我无法重现这个问题

假设驱动器状态在整个程序执行过程中永远不会改变,这有一个根本问题。我明白。然而,这段代码在大多数情况下似乎都很好,而且在过去一直如此

问题: 什么会导致
DriveInfo.IsReady
false

文件说明

true
如果驱动器已准备就绪<代码>错误如果驱动器未就绪

不用谢。备注部分添加

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

  • 它不是可移动驱动器。我们说的是老掉牙的
    C:\
  • 这不是权限问题,因为它有时对同一用户有效,有时无效
  • 这不是因为省电模式导致驱动器不可用的问题,因为
    • 节电模式未激活,并且
    • 这是一个SSD
声明

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

这是否意味着如果其他线程同时在驱动器上执行某些操作,
DriveInfo.IsReady
可能是
false

是否需要将
DriveInfo.IsReady
设置为
true
以检查目录是否存在?

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

我不认为线程安全是这里的问题。除了那些完全线程安全的类之外,所有类都写满了这句话。因为您每次都在创建新实例,所以这并不是真正的问题。