Как определить, вызвано ли перехваченное исключение IOException файлом, используемым другим процессом, не прибегая к синтаксическому анализу свойства сообщения исключения

StackOverflow https://stackoverflow.com/questions/2568875

Вопрос

Когда я открываю файл, я хочу знать, используется ли он другим процессом, чтобы я мог выполнить особую обработку;любое другое исключение IOException я всплыву.Свойство сообщения IOException содержит «Процесс не может получить доступ к файлу 'foo', потому что он используется другим процессом.», Но это не подходит для программного обнаружения.Каков самый безопасный и надежный способ обнаружить файл, используемый другим процессом?

Это было полезно?

Решение

Эта конкретная версия IOException выдается, когда код ошибки, возвращаемый встроенной функцией Win32, - ERROR_SHARING_VIOLATION ( Документация) .Он имеет числовое значение 0x20, но на самом деле сохраняется как 0x80070020 в свойстве исключения HRESULT (это результат вызова MakeHRFromErrorCode).

Таким образом, программный способ проверки нарушения совместного использования - это проверка свойства HResult в коде IOException на предмет значения 0x80070020.

Genracodicetagpre

Однако я сомневаюсь, что именно вы хотите сделать в сценарии, который возник в результате нарушения совместного доступа.В тот момент, когда возникает исключение, другой процесс может выйти и, следовательно, удалить нарушение.

Другие советы

У меня недостаточно "представителей", чтобы комментировать, так что, надеюсь, этот "ответ" в порядке ...

Принятый ответ - это именно то, что я искал, и он отлично работает, но люди здесь и по аналогичным вопросам сомневаются в полезности проверки, заблокирован ли файл.Верно, что служебная функция для проверки блокировки файла бесполезна, потому что в следующем операторе состояние могло измениться.

Но шаблон попытки выполнить операцию блокировки и затем по-разному реагировать на ошибки блокировки по сравнению с общими ошибками является допустимым и полезным.Самое очевидное, что нужно сделать, - это немного подождать и повторить операцию.Это можно обобщить в вспомогательную функцию следующим образом:

Genracodicetagpre

... который затем можно использовать следующим образом:

Genracodicetagpre

... в любом случае, просто отправьте сообщение на случай, если кто-то с похожими потребностями сочтет этот шаблон полезным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top