Я видел несколько ответов об использовании Handle или Process Monitor , но мне хотелось бы узнать в своем собственном коде (C #), какой процесс блокирует файл.
У меня неприятное чувство, что мне придется поболтать в Win32 API, но если кто-то уже сделал это и может поставить меня на правильный путь, я был бы очень признателен за помощь.
Обновить
Ссылки на похожие вопросы
c#
file-locking
AJ.
источник
источник
Ответы:
Одна из хороших вещей в
handle.exe
том, что вы можете запустить его как подпроцесс и проанализировать вывод.Мы делаем это в нашем сценарии развертывания - работает как шарм.
источник
Давным-давно было невозможно надежно получить список процессов, блокирующих файл, потому что Windows просто не отслеживала эту информацию. Для поддержки API Restart Manager эта информация теперь отслеживается.
Я собрал код, который берет путь к файлу и возвращает
List<Process>
все процессы, которые блокируют этот файл.Использование с ограниченным разрешением (например, IIS)
Этот вызов обращается к реестру. Если у процесса нет разрешения на это, вы получите ERROR_WRITE_FAULT, что означает
An operation was unable to read or write to the registry
. Вы можете выборочно предоставить разрешение вашей ограниченной учетной записи на необходимую часть реестра. Однако более безопасно, чтобы ваш процесс ограниченного доступа устанавливал флаг (например, в базе данных или файловой системе или с помощью механизма межпроцессного взаимодействия, такого как очередь или именованный канал) и имел второй процесс, вызывающий API-интерфейс Restart Manager.Предоставление разрешений, отличных от минимальных, пользователю IIS является угрозой безопасности.
источник
tasklist /m YourDllName.dll
и проанализировать вывод. См. Stackoverflow.com/questions/152506/…Вызывать Win32 из C # очень сложно.
Вы должны использовать инструмент Handle.exe .
После этого ваш код C # должен быть следующим:
источник
/accepteula
. Я обновил ответ Геннадия с изменением.handle.exe
У меня были проблемы с решением Стефана . Ниже приведена модифицированная версия, которая, кажется, работает хорошо.
ОБНОВИТЬ
Если вы просто хотите узнать, какие процессы блокируют конкретную DLL, вы можете выполнить и проанализировать вывод
tasklist /m YourDllName.dll
. Работает на Windows XP и позже. ВидетьЧто это делает? список задач / м "mscor *"
источник
myProcessArray
член класса (но также на самом деле возвращается из getFileProcesses ()? То же самое и дляmyProcess
.Это работает для DLL, заблокированных другими процессами. Эта процедура не обнаружит, например, что текстовый файл заблокирован текстовым процессом.
C #:
VB.Net:
источник
проще с linq:
источник