Что заставляет DriveInfo.IsReady быть ложным?

ситуация

Я отлаживаю некоторый устаревший код, который выполняет некоторые проверки существования путей к каталогам. Первый, 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:\,
  • Это не проблема разрешения, потому что иногда она работает, а иногда нет для одного и того же пользователя.
  • Дело не в том, что диск становится недоступным из-за режима энергосбережения, потому что
    • режим энергосбережения не активен и
    • это SSD.

Старая документация гласит, что

Поток безопасности

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

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

0 ответов

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

Другие вопросы по тегам