是否有一种编程方式来确定文件是否正在使用?

时间:2010-05-06 00:05:29

标签: c# visual-studio-2008 file interop

案例和要点:我需要通过Interop打开一个Excel文件,如果我知道该文件正在使用中,它将有助于避免丑陋的COM错误。

除了尝试打开文件并捕获异常外,是否有一种编程方式来确定文件是否正在使用?

3 个答案:

答案 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;
    }