none
Как узнать, что файл заблокирован другим процессом, не используя конструкцию исключения? RRS feed

  • Вопрос

  • Всем добрый вечер!

     

    Возник вопрос...довольно простой: Как не используя конструкцию исключений проверить заблокирован ли файл другим процессом?

    Пытался, пытался...читал усиленно msdn...но результата так и не добился.

     

    Интересно узнать ваше мнение =)

    Буду благодарен всем за высказывание своих точек зрений.

     

    С уважением,

    Панкратов Святослав


    E-mail: Svatoslav.Pankratov@gmail.com
    12 января 2011 г. 20:37

Ответы

  • Без использования P/Invoke - никак. С использованием P/Invoke - через вызов Create/LockFile. Но в случае P/Invoke возникнет аналогичный вопрос - "как, не используя проверку на код ошибки,...." :) 

    Кстати, а зачем проверка без исключения/ошибки вообще нужна?

    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:23
    12 января 2011 г. 23:26
  • Я имел в виду - зачем нужна проверка на блокировку с практической точки зрения? Т.е. предположим что такая функция все-таки добавлена. Какое может быть практическое применение ее результата? :)

    Ты ее вызвал, получил "не залочен". Это не значит что при попытке открыть файл следующей же строкой он все еще будет не залочен. Т.е. в любом случае проверка на исключение/ошибку останется.

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

    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:22
    13 января 2011 г. 0:23
  • Проверка на "заблокированность" файла может иметь смысл для таких приложений как Unlocker .

    Если, любой ценой, нужен вариант именно без попытки блокировки файла, то можно сделать так же, как в утилите Handle : перечислить все процессы, их файловые дескрипторы и проверить статус блокировки файла при помощи NtQueryInformationFile, но опять же, эта информация будет валидна только на момент проверки.
    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:22
    13 января 2011 г. 9:08
  • Unlocker - это, скорее, исключение из правил. :)

    Такой способ не покажет блокировку файла процессом не на локальной машине, например, на сетевом диске. И будет требовать прав администратора.

    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:22
    13 января 2011 г. 12:15
  • Ну, технически, недоступность файла на сетевом диске не означает, что он заблокирован именно другим процессом. Да и в случае локальных дисков файл может быть заблокирован сторонним драйвером файловой системы. Если настолько детально подходить к вопросу и исходить из его точной формулировки, то для таких файлов невозможно стандартными средствами определить причину их блокировки.
    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:22
    13 января 2011 г. 12:41

Все ответы

  • Без использования P/Invoke - никак. С использованием P/Invoke - через вызов Create/LockFile. Но в случае P/Invoke возникнет аналогичный вопрос - "как, не используя проверку на код ошибки,...." :) 

    Кстати, а зачем проверка без исключения/ошибки вообще нужна?

    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:23
    12 января 2011 г. 23:26
  • Просто возник в голове вопрос, который не дает мне покоя =) 

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


    E-mail: Svatoslav.Pankratov@gmail.com
    12 января 2011 г. 23:49
  • Я имел в виду - зачем нужна проверка на блокировку с практической точки зрения? Т.е. предположим что такая функция все-таки добавлена. Какое может быть практическое применение ее результата? :)

    Ты ее вызвал, получил "не залочен". Это не значит что при попытке открыть файл следующей же строкой он все еще будет не залочен. Т.е. в любом случае проверка на исключение/ошибку останется.

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

    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:22
    13 января 2011 г. 0:23
  • Проверка на "заблокированность" файла может иметь смысл для таких приложений как Unlocker .

    Если, любой ценой, нужен вариант именно без попытки блокировки файла, то можно сделать так же, как в утилите Handle : перечислить все процессы, их файловые дескрипторы и проверить статус блокировки файла при помощи NtQueryInformationFile, но опять же, эта информация будет валидна только на момент проверки.
    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:22
    13 января 2011 г. 9:08
  • Unlocker - это, скорее, исключение из правил. :)

    Такой способ не покажет блокировку файла процессом не на локальной машине, например, на сетевом диске. И будет требовать прав администратора.

    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:22
    13 января 2011 г. 12:15
  • Ну, технически, недоступность файла на сетевом диске не означает, что он заблокирован именно другим процессом. Да и в случае локальных дисков файл может быть заблокирован сторонним драйвером файловой системы. Если настолько детально подходить к вопросу и исходить из его точной формулировки, то для таких файлов невозможно стандартными средствами определить причину их блокировки.
    • Помечено в качестве ответа Svyatoslav Pankratov 18 января 2011 г. 10:22
    13 января 2011 г. 12:41
  • Svyatoslav Pankratov, вы получили ответ на интересующий вас вопрос? Если да, то, пожалуйста, отметьте его.
    Для связи [mail]
    18 января 2011 г. 0:18
  • Прошу прощения. Я не забыл про свой вопрос. Проосто сессия в самом разгаре и ноут сломался, жду когда отремонтируют. Всем большое спасибо за ответы, впринципе теперь все понятно стало.
    E-mail: Svatoslav.Pankratov@gmail.com
    18 января 2011 г. 10:15