Файл заблокирован каким процессом?

В.Net есть способ точно определить, какой процесс заблокировал файл?

РЕДАКТИРОВАТЬ: Я делаю это, потому что я хочу, чтобы мой пользователь знал, что он не может изменить / открыть файл, потому что в данный момент другая программа, которую они используют (например, Excel), имеет его открытым. Надеюсь, это поможет.

3 ответа

Решение

Краткий ответ на это - нет.

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

Если вы хотите использовать вызовы API, взгляните на функцию NtQuerySystemInformation с параметром SYSTEM_PROCESS_INFORMATION. Это один из тех замечательных "недокументированных" методов, которые идут с замечательным отказом от ответственности:

NtQuerySystemInformation может быть изменена или недоступна в будущих версиях Windows. Приложения должны использовать альтернативные функции, перечисленные в этом разделе.

Так что я бы предложил избежать этого в пользу использования WMI.

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

Я бы порекомендовал хорошую небольшую статью о CodeProject под названием How To: (Почти) все в WMI через C# Часть 2: Процессы. (Часть 1 также хорошо читается, если вам нравятся такие вещи)

Ну... это не совсем способ.NET сделать это... но если вы просто хотите узнать, используя простую утилиту, посмотрите Handle из SysInternals.

Похоже, кто-то понял это (и вы также можете выучить немного французского:))

http://www.axcis.com.au/bb/viewtopic.php?p=505

Другие вопросы по тегам