Проверка доступности файла - PullRequest
       0

Проверка доступности файла

1 голос
/ 01 сентября 2011

Чтобы избежать исключений типа

(1) Процесс не может получить доступ к файлу, поскольку он использовался другим процессом

Я использовал следующий метод для проверки доступности файла перед дальнейшей обработкой.

private bool CheckIfFileBeingUsed(string FilePath)
    {
        FileStream Fs = null;
        try
        {
            Fs = File.Open(FilePath, FileMode.Open, FileAccess.Read, FileShare.None);
            Fs.Close();
        }
        catch (Exception)
        {
            return true; //Error File is being used
        }
        return false; //File is not being used.
    }

Может ли кто-нибудь посоветовать мне какой-либо Windows API или другие решения для такого тестирования доступности файлов вместо вышеуказанного метода File.Open?

Ответы [ 4 ]

6 голосов
/ 01 сентября 2011

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

Если предположить, что по какой-то причине это невозможно, такое тестирование по-прежнему не совсем надежно, поскольку теперь у вас есть состояние гонки. Даже если этот тест пройден, нет никакой гарантии, что файл будет в том же состоянии, когда вы запустите другой код для файла. Вот почему проще просто попытаться сделать то, что вы хотите, и обработать любые исключения в этот момент.

1 голос
/ 01 сентября 2011

Какова цель этой проверки в первую очередь? Вы пытаетесь избежать исключений, делая это раньше и ловя его, но почему бы не поймать его с вашим текущим дизайном? Кроме того, этот подход зависит от состояния гонки, поскольку файл может стать недоступным сразу после вашей проверки, поэтому единственный правильный способ сделать это - просто выполнить любую необходимую обработку и перехватить возникшие исключения.

0 голосов
/ 01 сентября 2011

Поскольку вы обрабатываете файл, проверьте явно, этот метод подойдет.Ваш метод возвращает true, даже если File Doesn't Exist

Я не думаю, что C # предоставляет какой-либо API для этого.

0 голосов
/ 01 сентября 2011

Ваш метод мне кажется действительным.Не забудьте закрыть поток в случае исключения:

    finally
    {
        if (Fs!= null)
            Fs.Close();
    }

Имейте в виду, что нет 100% гарантии, что это предотвратит исключение «файл используется».Между проверкой и фактическим открытием файла всегда существует очень короткий (мс) период, в течение которого файл может использоваться другим процессом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...