当文件被锁定时,模拟等待文件。在C#中打开

基本上,我和这张海报有同样的问题,但是在C#中: 等待文件可以用Win32读取

更多信息:我们的代码在我们的一个项目中调用File.Open ,当文件已被另一个进程( EDIT:或线程)打开时偶尔会死掉:

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

File.Open将抛出一个IOException (当前正在某处悄悄吞下),其HResult属性为0x80070020ERROR_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(); 

但是, HResultException的受保护成员,无法访问 – 代码无法编译。 是否有另一种访问HResult ,或者可能是我可能用来做我想要的.NET的另一部分?

哦,最后一个警告,这是一个doozy:我只能使用Visual Studio 2005和.NET 2.0。

您可以在catch子句中调用Marshal.GetHRForException()来获取错误代码。 无需反思:

 using System.Runtime.InteropServices; if (Marshal.GetHRForException(e) == ERROR_SHARING_VIOLATION) .... 

不幸的是,你最好的选择是使用reflection。 当然,由于您在尝试之间睡眠1秒,性能成本很可能会被忽视。