Что заставляет 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.