Есть ли программный способ определить, используется ли файл? - PullRequest
2 голосов
/ 06 мая 2010

Дело и точка: мне нужно открыть файл Excel через Interop, и это помогло бы избежать уродливых ошибок COM, если бы я знал, что файл используется.

Помимо попыток открыть файл и перехвата исключения, существует ли программный способ определить, используется ли файл?

Ответы [ 3 ]

2 голосов
/ 06 мая 2010

Вам понадобится открыть файл API Win32 (CreateFile или lopen) для монопольного доступа и проверить возвращаемое значение.

0 голосов
/ 06 мая 2010

Это хуже, чем это. Вам нужно не только поймать исключение, но и использовать отражение, чтобы избавиться от других ошибок. По крайней мере, это единственное решение, которое я нашел.

        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;
    }
0 голосов
/ 06 мая 2010

Какой бы метод вы ни использовали, между вашим вызовом и фактическим открытием файла ничто не гарантирует, что другой процесс не открыл файл.

Какой-то псевдокод:

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;
}
...