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