Подтвердить что ты не робот

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

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

Там должен быть лучший и быстрый способ. Любые идеи?

            try
            {
                using (FileStream fs = File.Open(GetLockFilename(), FileMode.Open, FileAccess.ReadWrite, FileShare.None))
                {
                    fs.Close();
                }
                // The file is not locked
            }
            catch (Exception)
            {
                // The file is locked
            }
4b9b3361

Ответ 1

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

Ответ 2

Правда, даже если вы выясните, как проверить, заблокирован ли файл к моменту перехода к следующей строке, где вы открываете файл, что-то еще в ОС может попытаться удержать этого файла, и ваш код, чтобы открыть его, все равно сработает. В любом случае вам придется попробовать/поймать. Поэтому я говорю "нет". На самом деле нет лучшего решения.

Ответ 3

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

Ответ 4

Чтобы ответить на ваш вопрос, было бы более удобно написать следующий метод расширения для класса FileInfo:

      public static bool IsLocked(this FileInfo f)
    {
            try 
            {
                string fpath = f.FullName;
                FileStream fs = File.OpenWrite(fpath);
                fs.Close();        
                return false;
            }

            catch (Exception) { return true; }      
    }

Как только вы создали метод, вы можете выполнить быструю проверку следующим образом:

  FileInfo fi = new FileInfo(@"C:\4067918.TIF");
  if (!fi.IsLocked()) { //DO SOMETHING HERE; }