При попытке удалить файл или папку, которая используется процессом, появляется диалоговое окно «Используемый файл», в котором отображается имя программы, заблокировавшей файл.
Однако в некоторых случаях диалоговое окно «Используемый файл» не отображает имя процесса, который заблокировал файл, который вы пытаетесь удалить. В некоторых случаях в диалоговом окне будет показано «действие не может быть завершено, поскольку файл открыт в другой процесс«.
Для исследования процессов и заблокированных файлов Windows Sysinternals Process Explorer, вероятно, является первым вариантом, который приходит на ум большинству пользователей. Тем не менее, есть два встроенные решения отображать текущий список открытых файлов вместе с соответствующими именами процессов.
Найдите, какой процесс заблокировал файл, используя:
- Монитор ресурсов (resmon.exe)
- Process Explorer от Microsoft Sysinternals
- Дескриптор от Microsoft Sysinternals
2. Process Explorer
Process Explorer не нуждается в представлении. В Process Explorer все, что вам нужно сделать, это использовать функцию поиска и ввести имя файла. Это показывает процесс, который обращается к файлу.
В представлении нижней панели вы можете при необходимости закрыть дескриптор файла.
Вы должны запустить Process Explorer от имени администратора, чтобы управлять процессами с повышенными правами. Чтобы поднять Process Explorer, откройте меню «Файл» → Показать детали для всех процессов.
Проверьте эти связанные статьи Process Explorer:
3. Ручка от Windows Sysinternals
Handle — это утилита от Microsoft Sysinternals, которая отображает информацию об открытых дескрипторах для любого процесса в системе. Вы можете использовать его для просмотра программ, у которых открыт файл, или для просмотра типов объектов и имен всех дескрипторов программы. Handle похож на версию Process Explorer для командной строки.
Заметка: В дескрипторе v4.21 имеется небольшая ошибка, из-за которой он всегда сообщает «Не найдено подходящих дескрипторов», если буква диска указана в верхнем регистре. Надеюсь, что Microsoft исправит это в следующем обновлении.
В окне командной строки администратора используйте синтаксис командной строки, чтобы найти процесс, в котором открыт файл:
handle.exe -a -u filename_with_path
Если имя файла содержит пробелы, заключите его в двойные кавычки.
Пример:
handle.exe -a -u "c:\users\ramesh\desktop\Mandate-form.pdf"
(Упоминание имени файла без пути может не обязательно работать в любой ситуации. Рекомендуется всегда указывать полный путь.)
Выходные данные показывают имя процесса, идентификатор процесса, имя пользователя, заблокированное (целевое) имя файла с путем.
Sysinternals Handle: аргументы командной строки
usage: handle [[-a [-l]] [-u] | [-c [-y]] | [-s]] [-p |] [name] [-nobanner]
— Сбросить всю информацию о ручках. -L Просто покажите дескрипторы разделов на основе файла подкачки. -с Закрывает указанный дескриптор (интерпретируется как шестнадцатеричное число).
Вы должны указать процесс по его PID. ПРЕДУПРЕЖДЕНИЕ. Закрытие дескрипторов может вызвать нестабильность приложения или системы.-Y Не запрашивайте подтверждение закрытой ручки. -s Печать счетчика каждого типа открытой ручки. -U Показывать имя пользователя-владельца при поиске дескрипторов. -п Дамп-дескрипторы, принадлежащие процессу (частичное имя принято). название Поиск дескрипторов объектов с (фрагмент принят). -nobanner Не отображать баннер запуска и сообщение об авторских правах. Никакие аргументы не будут сбрасывать все ссылки на файлы.
Добавить дескриптор Sysinternals в контекстное меню
Вы можете добавить дескриптор Sysinternals в контекстное меню для файлов, чтобы быстро найти программу, которая заблокировала файл. Чтобы добавить его в контекстное меню, выполните следующие действия:
- Загрузите Handle с сайта Microsoft Sysinternals.
- Скопируйте файлы Handle.exe handle64.exe в папку — например,
d:\tools
- Скопируйте следующие строки кода в Блокнот и сохраните файл как
find_handle.vbs
в постоянное место.'Runs Sysinternals Handle.exe utility with filename argument. '© Ramesh Srinivasan -- https://winhelponline.com/blog 'Created Date: Mar 29, 2008 'Updated Date: Jun 11, 2019 'For all versions of Windows, including Windows 10 Option Explicit Dim objShell, WshShell, objFSO, sBaseKey, sFilename Set objShell = CreateObject("Shell.Application") Set WshShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") If WScript.Arguments.Count = 0 Then sBaseKey = "HKCU\Software\Classes\*\shell\" WshShell.RegWrite sBaseKey & "FindHandle\", "Find Handle", "REG_SZ" WshShell.RegWrite sBaseKey & "FindHandle\command\", "wscript.exe " & """" & _ WScript.ScriptFullName & """" & " " & """" & "%1" & """", "REG_SZ" Else If objFSO.FileExists(WScript.Arguments(0)) = True Then sFilename = lcase(WScript.Arguments(0)) objShell.ShellExecute "cmd.exe", "/k d:\tools\handle.exe -a -u " & _ """" & sFilename & """", "", "runas", 1 End If End If
Заметка: Путь Sysinternals Handle.exe жестко закодирован как
d:\tools\handle.exe
в приведенном выше сценарии. Если программа находится по другому пути, измените путь в сценарии соответствующим образом. Для 64-битной Windows вы можете использовать либо Handle.exe или handle64.exe - Двойной щелчок
find_handle.vbs
добавить пункт контекстного меню в реестр. Вам нужно будет сделать это только один раз. Но если вы переместите скрипт в другую папку, вам нужно будет дважды щелкнуть по нему еще раз, чтобы обновить путь в реестре. - Вы увидите Найти ручку вариант, когда вы щелкаете правой кнопкой мыши по файлу. При нажатии на него запускается скрипт, который в свою очередь запускает handle.exe с аргументом имени файла, чтобы найти процесс, который заблокировал файл.
Удалить Найти ручку пункт контекстного меню, запустить редактор реестра (
regedit.exe
) и удалите следующий ключ:HKEY_CURRENT_USER\Software\Classes\*\shell\FindHandle
4. OpenFiles.exe — встроенный консольный инструмент
Еще один встроенный инструмент, который мы собираемся использовать, — это Openfiles.exe, консольный инструмент, который не является новым для Windows. Первоначально он был представлен в 2000 году как часть средств Windows Resource Kit 2000/2003. Эта утилита была включена по умолчанию в Windows Vista и выше (включая Windows 10). Openfiles отображает список открытых в данный момент файлов из локальных или общих папок, а также идентификатор дескриптора и имя исполняемого файла процесса. Этот инструмент также позволяет отключить один или несколько файлов, которые открыты удаленно из общей папки.
Включить глобальный флаг «Ведение списка объектов» в первый раз
Во-первых, чтобы включить отслеживание локальных дескрипторов файлов, необходимо включить флаг «поддерживать список объектов», выполнив следующую команду из командной строки администратора.
openfiles /local on
Вы увидите следующее сообщение:
ИНФОРМАЦИЯ: глобальный системный флаг «вести список объектов» в настоящее время включен.
Вам нужно будет выполнить эту команду только в первый раз. Затем перезапустите Windows, чтобы изменения вступили в силу.
Просмотр открытых файлов и соответствующих имен процессов
После перезапуска Windows в окне командной строки администратора введите:
openfiles
Здесь перечислены идентификатор файла / дескриптора, имя процесса и список файлов, открытых локально или удаленно через локальные точки доступа, в формате таблицы.
Чтобы просмотреть вывод в формате List или CSV, используйте параметр / query.
openfiles /query /FO LIST openfiles /query /FO CSV
Чтобы скопировать вывод в буфер обмена, перенаправьте вывод в Clip.exe, как показано ниже. Затем вставьте вывод в Блокнот или любой другой редактор по вашему выбору.
openfiles |clip
openfiles /query /FO LIST |clip openfiles /query /FO CSV |clip
Для получения дополнительной информации о копировании вывода командной строки в буфер обмена или сохранении вывода в файл см. Статью Как скопировать текст вывода командной строки в буфер обмена или сохранить в файл?
Чтобы узнать, используется ли конкретный файл программой (и узнать, какая программа), вы можете использовать следующую командную строку.
openfiles | findstr /i
Пример:
openfiles | findstr /i eiffel
Приведенная выше команда выводит список всех открытых файлов, которые содержат слово «eiffel» в имени файла. В этом примере Word 2016 в настоящее время блокирует файл «Эйфелева башня.docx» (ID 4576).
И диалог «Используемый файл» говорит мне то же самое.
Отключите файлы, открытые удаленно из общей папки.
Чтобы отключить файлы, открытые из общей папки, чтобы можно было удалить, переименовать файл или изменить содержимое, используйте
/disconnect
параметр, чтобы обрезать соединения с этим файлом. Вот параметры командной строки.OPENFILES /Disconnect [/S system [/U username [/P [password]]]] {[/ID id] [/A accessedby] [/O openmode]} [/OP openfile] Description: Enables an administrator to disconnect files and folders that have been opened remotely through a shared folder. Parameter List: /S system Specifies the remote system to connect to. /U [domain\]user Specifies the user context under which the command should execute. /P [password] Specifies the password for the given user context. /ID id Specifies to disconnect open files by file ID. The "*" wildcard may be used. /A accessedby Specifies to disconnect all open files by "accessedby" value. The "*" wildcard may be used. /O openmode Specifies to disconnect all open files by "openmode" value. Valid values are Read, Write or Read/Write. The "*" wildcard may be used. /OP openfile Specifies to disconnect all open file connections created by a specific "open file" name. The "*" wildcard may be used. /? Displays this help message. Examples: OPENFILES /Disconnect /? OPENFILES /Disconnect /ID 1 OPENFILES /Disconnect /A username OPENFILES /Disconnect /O Read/Write OPENFILES /Disconnect /OP "c:\My Documents\somedoc.doc" /ID 234 OPENFILES /Disconnect /S system /U username /ID 5 OPENFILES /Disconnect /S system /U username /P password /ID *
Openfiles.exe отлично справляется со списком всех открытых файлов вместе с именами процессов, но не может принудительно уничтожать процессы. Однако этот превосходный (но упускаемый из виду) встроенный консольный инструмент может пригодиться, если вы хотите быстро найти имя процесса, использующего файл, или отключить файл, доступ к которому осуществляется через общую папку пользователем сети — независимо от на стороннее решение.
5. OpenedFilesView
OpenedFilesView от Nirsoft отображает список всех открытых файлов в вашей системе. Для каждого открытого файла отображается дополнительная информация: значение дескриптора, доступ для чтения / записи / удаления, позиция файла, процесс, открывший файл и т. Д. При желании вы также можете закрыть один или несколько открытых файлов или закрыть процесс, который открыл эти файлы.
Вы можете закрыть процессы выбранных файлов или закрыть дескрипторы файлов. Номер дескриптора представлен в шестнадцатеричных значениях, тогда как консольный инструмент openfiles.exe показывает его в обычном формате. Этот инструмент также позволяет добавить опцию контекстного меню, чтобы быстро найти процесс, который в данный момент использует файл, через контекстное меню. Опция контекстного меню / поддержка командной строки, я считаю, является одной из самых полезных функций, предлагаемых OpenedFilesView.