Что заставляет DriveInfo.IsReady быть ложным? - PullRequest
0 голосов
/ 03 июля 2018

Положение

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

1 Ответ

0 голосов
/ 27 мая 2019

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

...