6

本质上,我有与此海报相同的问题,但在 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。

4

2 回答 2

8

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

using System.Runtime.InteropServices;

if (Marshal.GetHRForException(e) == ERROR_SHARING_VIOLATION)
    ....
于 2010-06-29T07:17:20.703 回答
0

不幸的是,你最好的选择是使用反射。当然,由于您在两次尝试之间睡了 1 秒,因此很可能不会注意到性能成本。

于 2010-06-29T07:08:53.007 回答