Что приводит к тому, что DriveInfo.IsReady имеет значение false?

Ситуация

Я отлаживаю некоторый устаревший код, который выполняет некоторые проверки существования путей к каталогам. Сначала проверяется 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.IsReady станет false?

В документации указано

true если диск готов; false, если диск не готов.

Спасибо за ничего. Раздел комментариев добавляет

IsReady указывает, готов ли диск. Например, он указывает, находится ли компакт-диск в приводе компакт-дисков или готово ли съемное запоминающее устройство для операций чтения/записи. Если вы не проверите, готов ли диск, а он не готов, запрос диска с помощью DriveInfo вызовет исключение IOException.

  • Это не съемный диск. Мы говорим о старом добром C:\.
  • Это не проблема разрешения, потому что иногда это работает, а иногда нет для одного и того же пользователя.
  • It's not a matter of the drive becoming unavailable due to power saving mode, because
    • power saving mode is not active and
    • это SSD.

старая документация утверждает, что

Безопасность потока

Любые общедоступные статические (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют потокобезопасность.

Означает ли это, что DriveInfo.IsReady может быть false, если какой-то другой поток одновременно выполняет какую-то операцию на диске? Нужно ли вообще, чтобы DriveInfo.IsReady было true, чтобы проверить, существует ли каталог?


person surface    schedule 03.07.2018    source источник
comment
Я не думаю, что безопасность потоков является проблемой здесь. Это точное предложение написано повсюду для всех классов, кроме тех, которые полностью потокобезопасны. Поскольку вы каждый раз создаете новые экземпляры, это не может быть проблемой.   -  person PMF    schedule 03.07.2018


Ответы (1)


Я встречал ситуацию, когда файловая система Ntfs была повреждена, и сработало событие 55 Ntfs. В это время DriveInfo.isReady() возвращает false.

person GTMer    schedule 27.05.2019