[英]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
属性为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。
您可以在catch
子句中调用Marshal.GetHRForException()
来获取错误代码。 无需反思:
using System.Runtime.InteropServices;
if (Marshal.GetHRForException(e) == ERROR_SHARING_VIOLATION)
....
不幸的是,你最好的选择是使用反射。 当然,由于您在尝试之间睡眠1秒,性能成本很可能会被忽视。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.