案例和要点:我需要通过Interop打开一个Excel文件,如果我知道该文件正在使用中,它将有助于避免丑陋的COM错误。
除了尝试打开文件并捕获异常外,是否有一种编程方式来确定文件是否正在使用?
答案 0 :(得分:2)
您需要使用Win32 API fileopen(CreateFile或lopen)进行独占访问,并检查返回值。
答案 1 :(得分:0)
无论您使用哪种方法,在您的通话与实际打开文件之间没有任何保证,而另一个进程尚未打开该文件。
一些伪代码:
internal File OpenExcelFile(String fileName)
{
File file = null;
var fileOpened = SomeLibrary.IsFileOpened(fileName);
if (!fileOpened)
{
// Nothing garanties that another process didnt grabbed the file between call and that the file is still closed!!!
file = ExcelLibrary.OpenFile(fileName);
}
return file;
}
答案 2 :(得分:0)
那比那更糟糕。您不仅需要捕获异常,还必须使用反射来消除其他错误的歧义。至少,这是我找到的唯一解决方案。
try
{
using (StreamWriter sw = new StreamWriter(filepath, false))
{
sw.Write(contents);
}
}
catch (System.IO.IOException exception)
{
if (!FileUtil.IsExceptionSharingViolation(exception))
throw;
}
...
public static bool IsExceptionSharingViolation(IOException exception)
{
Type type = typeof(Exception);
PropertyInfo pinfo = type.GetProperty("HResult", BindingFlags.NonPublic | BindingFlags.Instance);
uint hresult = (uint)(int)pinfo.GetValue(exception, null);
//ERROR_SHARING_VIOLATION = 32
//being an HRESULT adds the 0x8007
return hresult == 0x80070020;
}