Unable to delete or move or perform any action on a file because it is locked by a process? Find out which process is locking a file in Windows 11/10 using various methods discussed in this article.
Many times, when we attempt an action (delete, rename, copy, etc.) on a file, we get a File in Use dialog box showing a prompt that “The action can’t be completed because the file is open in another program“. In some cases, it will show the process or program name that is using the file. But, a lot of times, it doesn’t.
Now, how to tell which process has a file open? If it is urgent, you need to identify the process locking a file and then end the process to modify the target file. In this guide, we will be discussing different methods to check the process that is holding a file in Windows 11/10.
Here are the different methods to identify the process that is locking a file in Windows 11/10:
- Check the process that is locking a file using Resource Monitor.
- Use SysInternals Process Explorer to identify the process that is locking a file.
- Find out through Command Prompt using the Handle tool.
- Use OpenedFilesView freeware to identify the process holding a file.
Let’s elaborate on these methods now.
1] Check the process that is locking a file using Resource Monitor
Using Resource Monitor, you can identify the process or service locking a file. It is an inbuilt utility in Windows 10 that helps you monitor CPU usage, memory, disk network, file handles, etc.
Open Run app by pressing Windows + R hotkey and then type resmon in it. Press the OK button and Resource Monitor will open up.
In the Resource Monitor window, go to the CPU tab and expand the Associated Handles option. Now, in the search box, type the name of the file that is showing locked by a process and press Enter button. It will show you a list of processes holding the target file.
You can right-click on the process and select the End Process option to end it. After the process ends, try performing the action you wanted to on the previously locked file.
2] Use SysInternals Process Explorer to identify the process that is locking a file
Another option to identify the process or service holding a file is SysInternals Process Explorer. It is an advanced utility to find out detailed information regarding running processes on your system. To identify the process holding a file through it, you can follow below steps:
Firstly, download and run SysInternals Process Explorer on your PC. Now, in the Process Explorer window, go to the File menu and click on the Find Handle or DLL option. Next, enter the file name in the Process Explorer Search dialog window and press the Search option. All the processes that are using the file you entered will show up in the results.
Right-click on the identified process in the Process tab and then close it.
Now, check with the file if it is still held or locked by a process or not.
Related: The process cannot access the file because it is being used by another process.
3] Find out through Command Prompt using Handle tool
Handle is a command-based utility to tell which process has a file open. It is basically a command-line version of the above discussed SysInternals Process Explorer. You can follow the below steps to check the process holding a file in command prompt using this tool:
Download Handle from microsoft.com and extract the ZIP folder. Now, open CMD in the extracted folder. In the Command Prompt, enter a command with the following syntax:
handle.exe -a -u <filename-with-path>
For example:
handle.exe -a -u "C:\Users\KOMAL\Documents\Sample Files\twc.pdf"
As you enter the command, it will display a list of processes holding the file with process ID and username.
I tried to check the same by entering just the filename without the full path, it worked. But, it may not work for all files. So, it is recommended to enter the location of the locked file.
After identifying the process, you can close it from Task Manager.
4] Use OpenedFilesView freeware to identify the process holding a file
OpenedFilesView is a portable application to view all your opened files and the processes holding them. You can download its ZIP folder, extract it, and then run its OpenedFilesView.exe file to launch its interface. It will then display all currently opened files with respective details including process name, process ID, process path, file permissions, target file path, etc.
Locate your target file and check which process is holding it. Also, you can use its Find option to quickly search for a locked file and the associated process. After finding the process, right-click on the file and close all the processes holding it.
TIP: You can also use File Locksmith PowerToy.
Hope this guide helps you identify the process of holding a file and then closing it.
Now read: Delete Locked Files, and fix File Is Locked error.
Иногда при попытке удалить, переименовать или переместить какой-то файл в Windows вы можете получить сообщение, что файл занят/заблокирован/используется) другим процессом. Чаще всего имя программы, которая держит файл открытым указывается прямо в окне сообщения File Explorer. Чтобы снять блокировку файла достаточно просто закрыть эту программу. Но бывает ситуации, когда какой-то файл и библиотека используется неизвестным или системным процессом. В этом случае снять блокировку с файла немного сложнее.
Многие приложения открывают файлы в монопольном (эксклюзивном) режиме. При этом файл блокируется файловой системой от операций ввода вывода других приложений. Если вы закрываете приложение, блокировка с файла снимается.
Сообщение о блокировке файла может выглядеть по-разному. Например в следующем примере указан тип файла и с каким приложением он ассоциирован:
File/Folder in Use. The action can’t be completed because the file is open in another program. Close the folder or file and try again.
Файл уже используется. Операция не может быть завершена, так как файл или папка открыта в другой программе. Закройте файл и повторите попытку.
В этом случае вы можете легко понять какое приложение заблокировало файл и закрыть его.
Однако иногда можно увидеть более интересное сообщение, о том, что файл заблокирован неизвестным или системным процессом Windows. Это может быть, как процесс самой ОС Windows, так и другие процессе, работающий с правами System, например, антивирус, агент резервного копирования, база данных mssql и т.д.):
The action can’t be completed because the file is open in SYSTEM.
Файл уже используется. Действие не может быть выполнено, так как этот файл открыт в System.
Попробуем разобраться, как понять какой программой, службой или системным процессом Windows занят файл, как разблокировать файл и можно ли разблокировать файл не закрывая родительский процесс.
Самый простой вариант разблокировать файл – завершить процесс, которые его заблокировал. Но это не всегда возможно, особенно на серверах.
Чаще всего для поиска процесса, который заблокировал файл рекомендуют использовать утилиту Unlocker. Лично я
Unlocker
не использую, т.к. она не позволяет получить подробную информацию о процессе или цепочке процессов, которые заблокировали файл. Также нельзя освободить конкретный файл, занятый процессом – приходится завершать приложение целиком.
Кроме того, это сторонняя утилита, при установке которой нужно быть внимательным, т.к. в процессе она предлагает установить пачку ненужные программы в нагрузку.
Когда процесс в Windows открывает файл, этому потоку ввода/вывода назначается файловый дескриптор (handler). Процесс и его дочерние процессы получают доступ к файлу по этому дескриптору. Через Window API вы можете послать сигнал файловой системе на освобождение данного дескриптора и снятие блокировки с файла.
Принудительное закрытие файловых дескрипторов может вызвать нестабильную работу приложения или компьютера. Если вы не знаете, к чему приведет закрытие дескриптора файла для конкретного приложения, то не пытайтесь выполнить это на продуктивном сервере без предварительного теста.
Как разблокировать файл с помощью Process Explorer?
ProcessExplorer это бесплатная утилита из набора системных утилит Sysinternals, которую можно скачать на сайте Microsoft (https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer). Попробуем с помощью Process Explorer найти, какой процесс заблокировал определенный файл и освободить этот файл, сбросив файловый дескриптор процесса.
- ProcessExplorer не требует установки, просто скачайте распакуйте и запустите с правами администратора
procexp.exe
; - Выберите меню Find -> Find Handle or DLL (или нажмите
Ctrl-F
); - Укажите имя файла, который нужно разблокировать и нажмите Search;
- Выберите нужный файл. Процесс, который открыл файлы будет выделен в дереве процессов. Можно завершить этот процесс, щелкнув по нему правой кнопкой и выбрав Kill Process Tree. Но можно попробовать закрыть дескриптор файла, не завершая процесс целиком. Дескриптор файла, который вы искали, автоматически выделяется в нижней панели Process Explorer. Щелкните по дескриптору правой кнопкой и выберите Close handle. Подтвердите закрытие файла.
Если у вас в Process Explorer не отображается нижняя панель со списком открытых дескрипторов процесса, включите пункт меню View -> Lower Pane View -> Handles
Итак, вы закрыли дескриптор файла, не завершая родительский процесс. Теперь вы можете спокойно удалить или переименовать файл.
Сброс дескриптора файла с помощью утилиты Handle
Handle – это еще одна утилита командной строки из комплекта инструментов Sysinternals (доступна для скачивания на сайте Microsoft (https://docs.microsoft.com/en-us/sysinternals/downloads/handle. Она позволяет найти процесс, который заблокировал ваш файл и снять блокировку, освободив дескриптор.
- Скачайте и распакуйте архив с утилитой Handle;
- Запустите командную строку с правами администратора и выполните команду:
handle64.exe > listproc.txt
Данная команда сохранит список открытых дескрипторов в файл. Можно вывести дескрипторы для каталога, в котором находится файл, который вы хотите изменить:
Handle64.exe -a C:\Some\Path
или конкретного процесса:
handle64.exe -p winword.exe
- Откройте файл listproc.txt в любом текстовом редакторе и найдите строку, в которой указано имя заблокированного файла. Скопируйте ID дескриптора файла (значение в hex формате). Затем поднимитесь немного выше к разделу, в котором указан процесс, являющийся владельцем данного дескриптора и запишите его ID. Для процесса запущенного от имени системы скорее всего будет PID 4.
Для некоторых системных процессов handle.exe вернет следующий текст:
wininit.exe pid: 732 \<unable to open process>
. Это означает, что вы не может получить информацию об этих системных процессах (даже с правами администратора). Для получения дескрипторов файлов, открытых такими процессами, запустите командную строку с правами System и попробуйте получить список дескрипторов еще раз. - Теперь вернитесь в командную строку и сбросьте дескриптор файла по полученным HandleID и ProcessID. Формат команды следующий:
handl64e.exe -c HandleID -p ProcessID
Например:
handl64e.exe -c 18C -p 18800
- Утилита запросит подтвердить закрытие файла для указанного процесса. Подтвердите, нажав y -> enter
Если система отреагирует на закрытие файла корректно, вы разблокируете ваш файл без необходимости завершать процесс или перезагружать сервер/компьютер.
Узнаем какой процесс заблокировал файл или папку
Иногда Windows не может удалить файл или папку и сообщает, что они заблокированы. Чтобы освободить файл можно перезагружаться, а можно сделать это не прерывая работы без скачивания дополнительных утилит.
Чтобы узнать, что блокирует файл или папку в Windows нужно запустить встроенный монитор ресурсов. Например из диспетчера задач или другим способом. В мониторе ресурсов нужно выбрать ЦП, и ввести имя блокируемой папки или файла в строке связные дескрипторы. В результате будет показан процесс, который препятствует полному доступу к файлу или папке — как на картинке выше. Тут же по нему можно нажать правой кнопкой мыши и завершить. После этого файл или папку можно удалить.
Советуем прочитать
Наверное, каждому из пользователей Windows хотя бы раз приходилось иметь дело с так называемыми неудаляемыми файлами и папками. Как правило, причиной невозможности удалить, переместить или хотя бы переименовать такой объект является использование его каким-то процессом, причём необязательно чтобы этот процесс был системным. Это может быть антивирус, архиватор или какой-нибудь редактор.
Обычно в окне с ошибкой прямо указывается, что за процесс препятствует дальнейшим действиям с объектом, но бывает и так, что вместо этого сообщается, что файл или папка открыты в другой программе. Это понятно, но вот в какой именно?
Так вот, определить её очень просто. Во всех популярных версиях Windows (начиная с 7) есть такая встроенная утилита как «Монитор ресурсов», предназначающаяся для контроля использования программных и аппаратных ресурсов. В её поле зрения попадают все процессы, в том числе и зависшие. Она то как раз и подскажет, что именно держит файл или папку.
Нажмите сочетание клавиш Win + R и выполните в открывшемся окошке команду resmon.
Откроется окно монитора ресурсов. Переключитесь в нём на вкладку «ЦП» и введите в поле «Поиск дескрипторов» название объекта, при удалении, перемещении или переименовании которого возникла ошибка. Результаты отобразятся тут же, чуть ниже. В нашем примере удалению папки «Всякая всячина» препятствовал архиватор WinRAR, но в самом окне с описанием ошибки об этом ничего не говорилось.
Вот так всё просто. Кстати, если удерживающий процесс не является критическим, его можно завершить прямо из окна монитора ресурсов.
После этого проблемный файл, папка или другой объект легко смогут быть удалены обычным способом.
Загрузка…
При попытке удалить файл или папку, которая используется процессом, появляется диалоговое окно «Используемый файл», в котором отображается имя программы, заблокировавшей файл.
Однако в некоторых случаях диалоговое окно «Используемый файл» не отображает имя процесса, который заблокировал файл, который вы пытаетесь удалить. В некоторых случаях в диалоговом окне будет показано «действие не может быть завершено, поскольку файл открыт в другом процессе ».
Для исследования процессов и заблокированных файлов Windows Sysinternals Process Explorer, вероятно, является первым вариантом, который приходит на ум большинству пользователей. Тем не менее, есть два встроенных решения для отображения текущего списка открытых файлов вместе с соответствующими именами процессов.
1. Монитор ресурсов
Resource Monitor (resmon.exe) — это встроенный инструмент, который имеет много полезных функций. С помощью Resource Monitor вы можете отслеживать текущее использование сети и Интернета, просматривать связанные маркеры для заблокированных файлов, а также управлять процессами так же, как при использовании диспетчера задач.
$config[ads_text6] not found
Чтобы найти имя процесса, для которого заблокирован файл, щелкните вкладку ЦП, введите имя файла или его часть в текстовом поле «Связанные дескрипторы».
Мы рассмотрели Resource Monitor ранее. Проверьте эти статьи:
- Как использовать Resource Monitor, чтобы найти, какой процесс заблокировал файл?
- Какая программа использует всю вашу пропускную способность интернета? Используйте Resource Monitor, чтобы найти его
2. Process Explorer
Process Explorer не нуждается в представлении. В Process Explorer все, что вам нужно сделать, это использовать функцию поиска и ввести имя файла. Это показывает процесс, который обращается к файлу.
В представлении нижней панели вы можете при необходимости закрыть дескриптор файла.
Вы должны запустить Process Explorer от имени администратора, чтобы управлять процессами с повышенными правами. Чтобы повысить Process Explorer, выберите меню «Файл» → « Показать детали для всех процессов» .
Проверьте эти связанные статьи Process Explorer:
- Как удалить упрямый Undeletable файл или папку в Windows?
- Найдите, какая программа использует вашу веб-камеру в настоящее время
- Как найти, какая программа вызвала неизвестное сообщение об ошибке?
- Что означает «Не удалось перечислить объекты в контейнере»?
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: аргументы командной строки
использование: дескриптор [[-a [-l]] [-u] | [-c [-y]] | [-s]] [-p |] [имя] [-nobanner]
-a | Сбросить всю информацию о ручках. |
-l | Просто покажите маркеры разделов на основе файла подкачки. |
-с | Закрывает указанный дескриптор (интерпретируется как шестнадцатеричное число).
Вы должны указать процесс по его PID. ПРЕДУПРЕЖДЕНИЕ. Закрытие дескрипторов может вызвать нестабильность приложения или системы. |
-y | Не запрашивать подтверждение закрытой ручки. |
-s | Печать счетчика каждого типа открытой ручки. |
-u | Показывать имя пользователя-владельца при поиске дескрипторов. |
-п | Дамп-дескрипторы, принадлежащие процессу (частичное имя принято). |
название | Поиск дескрипторов объектов с (фрагмент принят). |
-nobanner | Не отображать баннер запуска и сообщение об авторских правах. |
Никакие аргументы не будут сбрасывать все ссылки на файлы.
$config[ads_text6] not found
Добавить дескриптор Sysinternals в контекстное меню
Вы можете добавить дескриптор Sysinternals в контекстное меню для файлов, чтобы быстро найти программу, которая заблокировала файл. Чтобы добавить его в контекстное меню, выполните следующие действия:
- Загрузите Handle с сайта Microsoft Sysinternals.
- Скопируйте файлы handle.exe & handle64.exe в папку — например,
d:\tools
- Скопируйте следующие строки кода в Блокнот и сохраните файл как
find_handle.vbs
в постоянном месте.'Запускает утилиту Sysinternals Handle.exe с аргументом имени файла. '© Ramesh Srinivasan - //winhelponline.com/blog' Дата создания: 29 марта 2008 г. 'Дата обновления: 11 июня 2019 г.' Для всех версий Windows, включая Windows 10 Option Explicit Dim objShell, WshShell, objFSO, sBaseKey, sFilename Установите objShell = CreateObject ("Shell.Application") Установите WshShell = CreateObject ("WScript.Shell") Установите objFSO = CreateObject ("Scripting.FileSystemObject") Если WScript.Arguments.Count = 0 Тогда sBaseKey = "HKCU \ Software \ Классы \ * \ shell \ "WshShell.RegWrite sBaseKey &" FindHandle \ ", " Find Handle ", " REG_SZ "WshShell.RegWrite sBaseKey &" FindHandle \ command \ ", " wscript.exe "&" "" "& _ WScript .ScriptFullName & "" "" & "" & "" "" & "% 1" & "" "", "REG_SZ" Иначе Если objFSO.FileExists (WScript.Arguments (0)) = True Тогда sFilename = lcase (WScript .Arguments (0)) objShell.ShellExecute "cmd.exe", "/kd:\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 / запрос / FO LIST openfiles / запрос / FO CSV
Чтобы скопировать вывод в буфер обмена, перенаправьте вывод в Clip.exe, как показано ниже. Затем вставьте вывод в Блокнот или любой другой редактор по вашему выбору.
openfiles | клип
openfiles / query / FO LIST | клип openfiles / query / FO CSV | клип
Для получения дополнительной информации о копировании вывода командной строки в буфер обмена или сохранении вывода в файл см. Статью Как скопировать текст вывода командной строки в буфер обмена или сохранить в файл?
Чтобы узнать, используется ли конкретный файл программой (и узнать, какая программа), вы можете использовать следующую командную строку.
открытые файлы | findstr / i
Пример:
открытые файлы | findstr / i eiffel
Приведенная выше команда выводит список всех открытых файлов, которые содержат слово «eiffel» в имени файла. В этом примере Word 2016 в настоящее время блокирует файл «Эйфелева башня.docx» (ID 4576).
$config[ads_text6] not found
И диалог «Файл используется» говорит мне то же самое.
Отключите файлы, открытые удаленно из общей папки.
Чтобы отключить файлы, открытые из общей папки, чтобы можно было удалить, переименовать файл или изменить его содержимое, используйте параметр /disconnect
для отключения соединений с этим файлом. Вот параметры командной строки.
OPENFILES / Disconnect [/ S system [/ U username [/ P [пароль]]]] {[/ ID id] [/ A accessagedby] [/ O openmode]} [/ OP openfile] Описание: Позволяет администратору отключать файлы и папки, которые были открыты удаленно через общую папку. Список параметров: / S система Указывает удаленную систему для подключения. / U [домен \] пользователь Указывает пользовательский контекст, в котором должна выполняться команда. / P [пароль] Определяет пароль для данного пользовательского контекста. / ID id Указывает отключить открытые файлы по идентификатору файла. Можно использовать подстановочный знак «*». / A accessedby Указывает отключить все открытые файлы по значению «accessedby». Можно использовать подстановочный знак «*». / O openmode Указывает отключить все открытые файлы по значению "openmode". Допустимые значения: чтение, запись или чтение / запись. Можно использовать подстановочный знак «*». / OP openfile Указывает отключить все открытые файловые соединения, созданные с помощью определенного имени «открытый файл». Можно использовать подстановочный знак «*». /? Отображает это справочное сообщение. Примеры: OPENFILES / Disconnect /? OPENFILES / Отключение / ID 1 OPENFILES / Отключение / Имя пользователя OPENFILES / Отключение / O Чтение / Запись OPENFILES / Отключение / OP "c: \ Мои документы \ somedoc.doc" / ID 234 OPENFILES / Отключение / S system / U имя пользователя / ID пользователя 5 OPENFILES / Отключение / S system / U username / P пароль / ID *
Openfiles.exe отлично справляется со списком всех открытых файлов вместе с именами процессов, но не может принудительно уничтожать процессы. Однако этот превосходный (но упускаемый из виду) встроенный консольный инструмент может пригодиться, если вы хотите быстро найти имя процесса, использующего файл, или отключить файл, доступ к которому осуществляется через общую папку пользователем сети — независимо от на стороннее решение.
5. OpenedFilesView
OpenedFilesView от Nirsoft отображает список всех открытых файлов в вашей системе. Для каждого открытого файла отображается дополнительная информация: значение дескриптора, доступ для чтения / записи / удаления, позиция файла, процесс, открывший файл и т. Д. При желании вы также можете закрыть один или несколько открытых файлов или закрыть процесс, который открыл эти файлы.
Вы можете закрыть процессы выбранных файлов или закрыть дескрипторы файлов. Номер дескриптора представлен в шестнадцатеричных значениях, тогда как консольный инструмент openfiles.exe показывает его в обычном формате. Этот инструмент также позволяет добавить опцию контекстного меню, чтобы быстро найти процесс, который в данный момент использует файл, через контекстное меню. Опция контекстного меню / поддержка командной строки, я считаю, является одной из самых полезных функций, предлагаемых OpenedFilesView.