Файл заблокирован каким процессом? - PullRequest
10 голосов
/ 19 марта 2010

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

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

Ответы [ 3 ]

6 голосов
/ 19 марта 2010

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

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

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

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

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

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

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

1 голос
/ 19 марта 2010

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

0 голосов
/ 19 марта 2010

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

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

...