У меня есть, по существу, та же проблема как этот плакат, но в 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.
Вы можете вызвать Marshal.GetHRForException ()
в предложении catch
, чтобы получить код ошибки. Не нужно размышлять:
using System.Runtime.InteropServices;
if (Marshal.GetHRForException(e) == ERROR_SHARING_VIOLATION)
....
К сожалению, лучше всего использовать отражение. Конечно, поскольку вы спите 1 секунду между попытками, затраты на производительность, скорее всего, останутся незамеченными.