Существует ли путь в .NET для обнаружения точно, какой процесс заблокировал файл?
Править: Я делаю это, потому что я хочу позволить своему пользователю знать, что они не могут изменить/открыть файл, потому что в данный момент, другая программа они используют (такие как Excel), имеет его открытый. Хотелось бы надеяться, это помогает.
Краткий ответ - нет.
Однако длинный ответ заключается в том, что существуют различные вызовы API и методы WMI, которые вы можете использовать для получения этой информации, но не ожидайте, что это будет быстро и просто.
Если вы хотите использовать вызовы API, обратите внимание на функцию NtQuerySystemInformation с параметром SYSTEM_PROCESS_INFORMATION. Это один из тех прекрасных «недокументированных» методов, к которому прилагается замечательный отказ от ответственности:
NtQuerySystemInformation может быть изменен или недоступен в будущих версиях Windows. Приложения должны использовать альтернативные функции , перечисленные в этом разделе.
Поэтому я бы посоветовал избежать этого в пользу использования WMI.
Вы можете использовать класс WMI Win32_Process , чтобы перечислить все процессы, запущенные в данный момент на машине, а затем перечислить все дескрипторы, которые каждый процесс удерживает, пока не найдете искомый файл. К сожалению, нет простого способа сказать «эй, какой процесс блокирует этот файл», он работает только наоборот, вы должны искать по списку процессов, пока не найдете тот, который блокирует интересующий вас файл.
Я бы порекомендовал хорошую небольшую статью о CodeProject под названием Как: (почти) все в WMI через C # Часть 2: Процессы . (Если вам нравятся подобные вещи, тоже неплохо прочитать)
Ну ... это не совсем способ .NET ... но если вы просто хотите выяснить это с помощью простой утилиты, посмотрите Handle из SysInternals .
Похоже, кто-то понял это (и вы можете выучить немного французского :))