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

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

EDIT. Я делаю это, потому что хочу, чтобы мой пользователь знал, что они не могут изменять/открывать файл, потому что на данный момент используется другая программа (например, Excel) открыт. Надеюсь, это поможет.

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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