Как определить, вызвано ли перехваченное исключение IOException файлом, используемым другим процессом, не прибегая к синтаксическому анализу свойства сообщения исключения
-
24-09-2019 - |
Вопрос
Когда я открываю файл, я хочу знать, используется ли он другим процессом, чтобы я мог выполнить особую обработку;любое другое исключение IOException я всплыву.Свойство сообщения IOException содержит «Процесс не может получить доступ к файлу 'foo', потому что он используется другим процессом.», Но это не подходит для программного обнаружения.Каков самый безопасный и надежный способ обнаружить файл, используемый другим процессом?
Решение
Эта конкретная версия IOException
выдается, когда код ошибки, возвращаемый встроенной функцией Win32, - ERROR_SHARING_VIOLATION
( Документация) .Он имеет числовое значение 0x20
, но на самом деле сохраняется как 0x80070020
в свойстве исключения HRESULT
(это результат вызова MakeHRFromErrorCode).
Таким образом, программный способ проверки нарушения совместного использования - это проверка свойства HResult
в коде IOException
на предмет значения 0x80070020
.
Однако я сомневаюсь, что именно вы хотите сделать в сценарии, который возник в результате нарушения совместного доступа.В тот момент, когда возникает исключение, другой процесс может выйти и, следовательно, удалить нарушение.
Другие советы
У меня недостаточно "представителей", чтобы комментировать, так что, надеюсь, этот "ответ" в порядке ...
Принятый ответ - это именно то, что я искал, и он отлично работает, но люди здесь и по аналогичным вопросам сомневаются в полезности проверки, заблокирован ли файл.Верно, что служебная функция для проверки блокировки файла бесполезна, потому что в следующем операторе состояние могло измениться.
Но шаблон попытки выполнить операцию блокировки и затем по-разному реагировать на ошибки блокировки по сравнению с общими ошибками является допустимым и полезным.Самое очевидное, что нужно сделать, - это немного подождать и повторить операцию.Это можно обобщить в вспомогательную функцию следующим образом:
Genracodicetagpre... который затем можно использовать следующим образом:
Genracodicetagpre... в любом случае, просто отправьте сообщение на случай, если кто-то с похожими потребностями сочтет этот шаблон полезным.