情况

我正在调试一些旧代码,这些旧代码对目录路径执行一些存在性检查。首先,检查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.IsReady执行这种对DirectoryPathB的检查。

问题

即使DirectoryPathA是本地目录(因此也不会造成网络中断),但之上的代码偶尔也会通过返回DirectoryPathB。该代码执行了几次,并被认为是幂等的,但实际上并非如此,这会破坏代码。
这仅在某些机器上几个小时内偶尔发生。我无法重现该问题。

假设有一个基本问题,即在程序执行期间驱动状态永远不会改变。我明白那个。但是,这段代码在大多数情况下似乎都不错,并且已经过去了。

问题

是什么会导致DriveInfo.IsReadyfalse

文档说明



不用了,谢谢。备注部分添加


  • 这不是可移动驱动器。我们在说普通的C:\
  • 这不是权限问题,因为它有时可以工作,有时不适用于同一用户。
  • 这不是由于省电模式而导致驱动器不可用的问题,因为
  • 节电模式未激活,并且
  • 这是一个SSD。

  • The old documentation指出



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

    最佳答案

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

    关于c# - 是什么导致DriveInfo.IsReady为假?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51149329/

    10-12 23:56