繁体   English   中英

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

[英]Emulate waiting on File.Open in C# when file is locked

基本上,我和这张海报有同样的问题,但是在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)
    ....

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM