Есть ли способ получить идентификатор ошибки для IOException, вызванного из-за блокировки доступа к файлу Windows Defender? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь получить доступ к файлам в своей папке Download и хочу разграничить возможные ошибки, чтобы лучше информировать пользователя в случае, если что-то пошло не так, особенно когда Windows Defender вмешивается (см. Ниже).

Мой код выглядит примерно так:

try
{
    fileContents = File.ReadAllBytes(fileInfo.FullName);
}
catch (IOException ex)
{
    if (ex != null && ex.Message.IndexOf("virus", StringComparison.OrdinalIgnoreCase) != -1)
    {
        myDataObject.ScanStatus = ScanStatusInfo.NotAccessable;
        throw;
    }
}

Сравнение строк сообщения об исключении - мой грязный обходной путь для Windows Defender перехвата доступа к потенциально зараженному файлу (вы можете проверить его, например, с помощью eicar test вирус ). Я хотел бы использовать другой подход (на основе идентификатора) для обработки таких случаев, а не полагаться на фактическую строку сообщения.

1 Ответ

1 голос
/ 02 мая 2020

Я обновил свой подход следующим образом, основываясь на информации из hresult.info

const uint ERROR_VIRUS_INFECTED = 0X800700E1;

[...]

try
{
    fileContents = File.ReadAllBytes(fileInfo.FullName);
}
catch (IOException ex)
{
    // This handles the case that Windows Defender stopped access to the file due to a virus.
    // If this is the case, we won't get any access and throw the exception instead.
    if (ex != null && (0xFFFF & ex.HResult) == (0XFFFF & ERROR_VIRUS_INFECTED))
    {
        myDataObject.ScanStatus = ScanStatusInfo.NotAccessable;
        throw;
    }
}

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

...