Эмулируйте ожидание на Файле. Открытый в C#, когда файл заблокирован

У меня есть, по существу, та же проблема как этот плакат, но в C#: Ожидание до файла доступно для чтения с Win32

Больше информации: у нас есть код, который звонит File.Open в одном из наших проектов, который иногда умирает, когда файл уже открыт другим процессом (РЕДАКТИРОВАНИЕ: или поток):

FileStream stream = File.Open(m_fileName, m_mode, m_access);
/* do stream-type-stuff */
stream.Close();

File.Open бросит IOException (который в настоящее время бесшумно глотают где-нибудь), чей HResult свойство 0x80070020 (ERROR_SHARING_VIOLATION). То, что я хотел бы сделать, является этим:

FileStream stream = null;
while (stream == null) {
    try {
        stream = File.Open(m_fileName, m_mode, m_access, FileShare.Read);
    } catch (IOException e) {
        const int ERROR_SHARING_VIOLATION = int(0x80070020);
        if (e.HResult != ERROR_SHARING_VIOLATION)
            throw;
        else
            Thread.Sleep(1000);
    }
}
/* do stream-type-stuff */
stream.Close();

Однако HResult защищенный член Exception, и не может быть получен доступ - код не компилирует. Есть ли другой способ получить доступ HResult, или возможно, другая часть.NET я мог бы использовать, чтобы сделать то, что я хочу?

О, один заключительный протест, и это - doozy: я ограничен использованием Visual Studio 2005 и.NET 2.0.

6
задан Community 23 May 2017 в 12:13
поделиться

2 ответа

Вы можете вызвать Marshal.GetHRForException () в предложении catch , чтобы получить код ошибки. Не нужно размышлять:

using System.Runtime.InteropServices;

if (Marshal.GetHRForException(e) == ERROR_SHARING_VIOLATION)
    ....
8
ответ дан 16 December 2019 в 21:34
поделиться

К сожалению, лучше всего использовать отражение. Конечно, поскольку вы спите 1 секунду между попытками, затраты на производительность, скорее всего, останутся незамеченными.

0
ответ дан 16 December 2019 в 21:34
поделиться
Другие вопросы по тегам:

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