Эмулировать ожидание на File.Open в C #, когда файл заблокирован - PullRequest
6 голосов
/ 29 июня 2010

У меня, по сути, та же проблема, что и у этого постера, но в 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, которую я мог бы использовать, чтобы делать то, что я хочу?

О, одно последнее предупреждение, и это глупо: я ограниченс использованием Visual Studio 2005 и .NET 2.0.

Ответы [ 2 ]

8 голосов
/ 29 июня 2010

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

using System.Runtime.InteropServices;

if (Marshal.GetHRForException(e) == ERROR_SHARING_VIOLATION)
    ....
0 голосов
/ 29 июня 2010

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

...