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