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

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

10
задан Cœur 6 August 2017 в 16:38
поделиться

1 ответ

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

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

public static bool IsSharingViolation(this IOException ex) {
  return 0x80070020 == Marshal.GetHRForException(ex);
}

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

14
ответ дан 3 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: