Вопрос или проблема
Как я могу узнать, какой процесс блокирует файл или папку в Windows?
Например, пытаясь удалить папку, Windows сообщает следующее:
Действие не может быть завершено, так как папка открыта в другой программе
То же самое происходит с файлами.
Как мне узнать, какая программа или приложение в данный момент использует файл или папку, мешая мне их удалить?
Метод PowerShell:
if ((Test-Path -Path $FileOrFolderPath) -eq $false) {
Write-Warning "Файл или каталог не существует."
} else {
$LockingProcess = CMD /C "openfiles /query /fo table | find /I ""$FileOrFolderPath"""
Write-Host $LockingProcess
}
Команда openfiles
должна поддерживать локальные файлы, для этого выполните openfiles /local on
и перезагрузите.
Подробнее Как узнать, какой процесс блокирует файл или папку в Windows архив
Вы можете использовать Диспетчер ресурсов, который встроен в Windows 7, 8, 10 и 11!
- Откройте Диспетчер ресурсов, который можно найти
- Поиск по Диспетчер ресурсов или resmon.exe в меню “Пуск”, или
- Как кнопку на вкладке Производительность в вашем Диспетчере задач
- Перейдите на вкладку ЦП
- В разделе Процессы выберите все процессы, нажав на чекбокс рядом с “Изображением” в заголовках.
- Используйте поле поиска в разделе Связанные дескрипторы
- Смотрите синюю стрелку на скриншоте ниже
Когда вы найдете дескриптор, вы можете идентифицировать процесс, посмотрев на столбец “Изображение” и/или PID.
Затем вы можете попытаться закрыть приложение, как обычно, или, если это невозможно, просто щелкните правой кнопкой мыши по дескриптору и завершите процесс прямо оттуда. Легко и просто!
Несколько вариантов:
Microsoft/SysInternals Process Explorer – Перейдите в Найти > Найти дескриптор или DLL. В текстовом поле “Дескриптор или подстрока DLL:” введите путь к файлу (например, “C:\path\to\file.txt”) и нажмите “Поиск”. Все процессы, у которых открыт дескриптор этого файла, должны быть перечислены.
WhoLockMe – Расширение для проводника, добавляющее опцию в контекстное меню правой кнопки мыши
Замечание. WhoLockMe, похоже, не работает с Windows 10 (по крайней мере, я не смог зарегистрировать его ни с 32-, ни с 64-битными версиями regsvr32.exe).
Посмотрите на Process Explorer (procexp.exe
).
Из введения:
Вам когда-нибудь было интересно, какая программа открыла конкретный файл или каталог? Теперь вы можете это узнать.
Чтобы выяснить, какой процесс использует конкретный файл, следуйте этим шагам:
-
Перейдите в Найти, Найти дескриптор или DLL.. или просто нажмите Ctrl+F.
-
Введите имя файла и нажмите Поиск.
-
Process Explorer покажет все процессы, у которых есть открытый дескриптор к файлу. Щелкните по записи, чтобы сфокусироваться на процессе в основном окне.
-
Если хотите, вы можете даже закрыть дескриптор вручную через нижнюю панель (Ctrl+L):
LockHunter может разблокировать любые дескрипторы, которые могут заблокировать ваши файлы или папки. В отличие от аналогичного бесплатного ПО, он поддерживает как 32-, так и 64-битные Windows.
Это бесплатный инструмент для удаления файлов, заблокированных чем-то неизвестным. LockHunter полезен для борьбы с вредоносным ПО и другими программами, которые блокируют файлы без причины. В отличие от других аналогичных инструментов, он удаляет файлы в корзину, чтобы вы могли восстановить их, если их удалили по ошибке.
- Показывает процессы, блокирующие файл или папку
- Позволяет разблокировать, удалить, скопировать или переименовать заблокированный файл
- Позволяет убивать блокирующий процесс
- Позволяет удалить блокирующие процессы с жесткого диска
- Интегрируется в меню проводника
- Удаляет файлы в корзину, чтобы вы могли их восстановить, если удалили по ошибке
- Поддерживает как 32-, так и 64-битные Windows
Microsoft PowerToys File Locksmith
Он выполняет именно то, что вы просите.
- Щелкните правой кнопкой мыши на файле или папке, чтобы открыть контекстное меню
- Утилита откроется, показывая блокирующие процессы. Там вы можете увидеть, какие файлы заблокированы, и завершить конкретный процесс
Альтернатива: ShowWhatProcessLocksFile
ShowWhatProcessLocksFile — это легковесный и быстрый клон File Locksmith, который поддерживает более ранние версии Windows.
EMCO UnlockIT может определить процесс, который заблокировал файл, а также разблокировать файл, чтобы вы могли удалить/изменить/переместить его. Программа абсолютно бесплатна, хотя новая версия немного медленнее и более громоздка, чем оригинал (у которого был простой интерфейс без скинов, но загружался практически мгновенно и без надоедливого начального экрана). Также старая версия запускалась автоматически при возникновении ошибки, о которой вы упомянули, позволяя мгновенно разблокировать файл и выполнить операцию, которую вы пытались.
Тем не менее, UnlockIT — невероятно полезная программа, которая предоставляет базовую функциональность, которой критично не хватает в Windows. Это один из стандартного набора утилит, которые я устанавливаю на все компьютеры с Windows, с которыми работаю.
Многие из представленных здесь программ устарели. В конце концов я использовал OpenedFilesView от nirsoft, которая работала очень хорошо.
Хотя самая лучшая часть — это интеграция с меню проводника, которую легко включить. Согласно веб-сайту
Контекстное меню Проводника
Начиная с версии 1.10, вы можете запускать OpenedFilesView непосредственно из проводника Windows и просматривать только дескрипторы файла или папки, которые вы хотите проверить. Чтобы включить эту функцию, установите флажок “Включить контекстное меню Проводника” в меню “Параметры”. После включения этой функции вы можете щелкнуть правой кнопкой мыши на любом файле или папке в проводнике Windows и выбрать элемент “OpenedFilesView” из меню. Если вы выберете папку в меню OpenedFilesView, будут показаны все открытые файлы в этой папке. Если вы выберете файл, будут показаны все открытые дескрипторы для этого файла.
Этот инструмент по-прежнему надежно работает в 2019 году
Если вы не знаете программу, которая использует файл, вы можете перейти в Мой компьютер; щелкнуть правой кнопкой; выбрать Управление. В разделе Системные инструменты > Общие папки > Открытые файлы, вы сможете увидеть пользователя, который заблокировал файл. Вы можете закрыть файл отсюда, а затем выполнить задачу по переименованию или удалению файла. Надеюсь, это поможет
Утилита handle от SysInternal специально предназначена для этой проблемы для командной строки. Просто выполните следующую команду:
handle -a
путь
Вот пример вывода:
→handle -a "C:\Users\me\AppData\Local\Microsoft\Windows\Explorer\iconcache_32.db"
Nthandle v5.0 - Просмотр дескрипторов
Copyright (C) 1997-2022 Mark Russinovich
Sysinternals - www.sysinternals.com
xplorer2_64.exe pid: 108904 type: File 844: C:\Users\me\AppData\Local\Microsoft\Windows\Explorer\iconcache_32.db
xplorer2_64.exe pid: 108904 type: File 1098: C:\Users\me\AppData\Local\Microsoft\Windows\Explorer\iconcache_32.db
xplorer2_64.exe pid: 108904 type: File 1B78: C:\Users\me\AppData\Local\Microsoft\Windows\Explorer\iconcache_32.db
explorer.exe pid: 75252 type: File 2B68: C:\Users\me\AppData\Local\Microsoft\Windows\Explorer\iconcache_32.db
explorer.exe pid: 75252 type: File 4B1C: C:\Users\me\AppData\Local\Microsoft\Windows\Explorer\iconcache_32.db
firefox.exe pid: 20884 type: File 15A8: C:\Users\me\AppData\Local\Microsoft\Windows\Explorer\iconcache_32.db
firefox.exe pid: 20884 type: File 3BF4: C:\Users\me\AppData\Local\Microsoft\Windows\Explorer\iconcache_32.db
Дополнительная возможность, просто чтобы сэкономить людям время, которое я только что потратил:
В старых версиях Windows вы можете получить “Отказано в доступе — возможно, у вас нет прав, или файл может быть использован”. Если вы обнаружите через Process Explorer, что файлы на самом деле никем не открыты, это может быть проблема с безопасностью. Используя учетную запись администратора, выберите файлы в Проводнике, щелкните правой кнопкой мыши и выберите Свойства, Безопасность, Дополнительно, Владелец. Скорее всего, файлы принадлежат учетной записи, которая больше не существует или которую больше невозможно проверить (из-за изменений параметров доверия Active Directory).
Измените владельца на Администраторы, и все готово.
Вот мое открытие и решение.
Ни одно из вышеупомянутых решений не решило мою проблему.
Я даже пробовал использовать UNLOCKER, который оказался бесполезным.
Моя проблема была в том, что Memeo Autosync Backup
Очевидно, этот процесс резервного копирования оставляет достаточно “призрачных файлов”. Эти “призрачные файлы” появлялись всякий раз, когда я нажимал ALT-TAB на моем компьютере (Windows Professional XP), т. е. я видел два работающих приложения MS Excel, хотя у меня было открыто только одно, на панели задач.
Я пришел к этому решению, когда подумал, что это может быть защита SYMANTEC Endpoint (антивирус); и отключил программу. Однако я продолжал получать сообщение об ошибке:
невозможно удалить файл (LARGE.xls): этот файл используется другим человеком или программой. Закройте все программы, которые могут использовать этот файл, и попробуйте снова.
Затем я продолжал видеть уведомление Memeo о “синхронизации” и ВЫЙДИТЕ из программы.
Затем ошибка исчезла.
Для вас это может быть любая из этих программ фонового сохранения.
Вы также можете сделать это программным способом, используя API NTDLL/KERNEL32 Windows. Например, посмотрите на следующий код Python, который возвращает список PID, которые можно легко уничтожить с помощью диспетчера задач или аналогичных инструментов.
import ctypes
from ctypes import wintypes
path = r"C:\temp\test.txt"
# -----------------------------------------------------------------------------
# generic strings and constants
# -----------------------------------------------------------------------------
ntdll = ctypes.WinDLL('ntdll')
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
NTSTATUS = wintypes.LONG
INVALID_HANDLE_VALUE = wintypes.HANDLE(-1).value
FILE_READ_ATTRIBUTES = 0x80
FILE_SHARE_READ = 1
OPEN_EXISTING = 3
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
FILE_INFORMATION_CLASS = wintypes.ULONG
FileProcessIdsUsingFileInformation = 47
LPSECURITY_ATTRIBUTES = wintypes.LPVOID
ULONG_PTR = wintypes.WPARAM
# -----------------------------------------------------------------------------
# create handle on concerned file with dwDesiredAccess == FILE_READ_ATTRIBUTES
# -----------------------------------------------------------------------------
kernel32.CreateFileW.restype = wintypes.HANDLE
kernel32.CreateFileW.argtypes = (
wintypes.LPCWSTR, # In lpFileName
wintypes.DWORD, # In dwDesiredAccess
wintypes.DWORD, # In dwShareMode
LPSECURITY_ATTRIBUTES, # In_opt lpSecurityAttributes
wintypes.DWORD, # In dwCreationDisposition
wintypes.DWORD, # In dwFlagsAndAttributes
wintypes.HANDLE) # In_opt hTemplateFile
hFile = kernel32.CreateFileW(
path, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, None, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, None)
if hFile == INVALID_HANDLE_VALUE:
raise ctypes.WinError(ctypes.get_last_error())
# -----------------------------------------------------------------------------
# prepare data types for system call
# -----------------------------------------------------------------------------
class IO_STATUS_BLOCK(ctypes.Structure):
class _STATUS(ctypes.Union):
_fields_ = (('Status', NTSTATUS),
('Pointer', wintypes.LPVOID))
_anonymous_ = '_Status',
_fields_ = (('_Status', _STATUS),
('Information', ULONG_PTR))
iosb = IO_STATUS_BLOCK()
class FILE_PROCESS_IDS_USING_FILE_INFORMATION(ctypes.Structure):
_fields_ = (('NumberOfProcessIdsInList', wintypes.LARGE_INTEGER),
('ProcessIdList', wintypes.LARGE_INTEGER * 64))
info = FILE_PROCESS_IDS_USING_FILE_INFORMATION()
PIO_STATUS_BLOCK = ctypes.POINTER(IO_STATUS_BLOCK)
ntdll.NtQueryInformationFile.restype = NTSTATUS
ntdll.NtQueryInformationFile.argtypes = (
wintypes.HANDLE, # In FileHandle
PIO_STATUS_BLOCK, # Out IoStatusBlock
wintypes.LPVOID, # Out FileInformation
wintypes.ULONG, # In Length
FILE_INFORMATION_CLASS) # In FileInformationClass
# -----------------------------------------------------------------------------
# system call to retrieve list of PIDs currently using the file
# -----------------------------------------------------------------------------
status = ntdll.NtQueryInformationFile(hFile, ctypes.byref(iosb),
ctypes.byref(info),
ctypes.sizeof(info),
FileProcessIdsUsingFileInformation)
pidList = info.ProcessIdList[0:info.NumberOfProcessIdsInList]
print(pidList)
Вот полное решение на PowerShell для этой проблемы:
cls
remove-variable * -ea 0
$errorActionPreference="stop"
Add-Type -TypeDefinition @"
using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
public static class ProcessUtils {
[StructLayout(LayoutKind.Sequential)]
private struct IO_STATUS_BLOCK {
public IntPtr Information;
public IntPtr Status;
}
[StructLayout(LayoutKind.Sequential)]
public struct FILE_PROCESS_IDS_USING_FILE_INFORMATION {
public ulong NumberOfProcessIdsInList;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public ulong[] ProcessIdList;
}
[DllImport("ntdll.dll")]
private static extern int NtQueryInformationFile(SafeFileHandle FileHandle, ref IO_STATUS_BLOCK IoStatusBlock,
IntPtr FileInformation, uint Length, int FileInformationClass);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern SafeFileHandle CreateFile(string lpFileName, FileAccess dwDesiredAccess,
FileShare dwShareMode, IntPtr lpSecurityAttributes, FileMode dwCreationDisposition,
FileAttributes dwFlagsAndAttributes, IntPtr hTemplateFile);
public static ulong[] GetProcessesUsingFile(string filePath) {
var processIds = new ulong[0];
var ioStatusBlock = new IO_STATUS_BLOCK();
var fileInfo = new FILE_PROCESS_IDS_USING_FILE_INFORMATION();
using (var fileHandle = CreateFile(filePath, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero)) {
if (!fileHandle.IsInvalid) {
var fileInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(fileInfo));
var fileInfoSize = Marshal.SizeOf(fileInfo);
try {
int result = NtQueryInformationFile(fileHandle, ref ioStatusBlock, fileInfoPtr, (uint)fileInfoSize, 47);
if (result == 0) {
fileInfo = Marshal.PtrToStructure<FILE_PROCESS_IDS_USING_FILE_INFORMATION>(fileInfoPtr);
if (fileInfo.NumberOfProcessIdsInList > 0) {
processIds = new ulong[fileInfo.NumberOfProcessIdsInList];
Array.Copy(fileInfo.ProcessIdList, processIds, (int)fileInfo.NumberOfProcessIdsInList);
}
}
}
finally {
Marshal.FreeHGlobal(fileInfoPtr);
}
}
}
return processIds;
}
}
"@
# Get processes using a file:
$file="c:\temp\test.txt"
[ProcessUtils]::GetProcessesUsingFile($file)
Я не уверен, использовали ли кто-то Process Viewer
(PVIEW.exe). У меня были проблемы с определением процесса, который заблокировал мой epmd.exe
, который я пытался удалить, когда я искал приложение Process Explorer
в моей Windows 10 – я нашел это приложение. Так что я решил попробовать, и это сработало (так что это может быть еще одной опцией):
Это приложение находилось в следующем месте для меня –
C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT\Tools\PVIEW.EXE
Найдите ваше заблокированное приложение (файл) и убейте процесс
, чтобы разблокировать файл.
Просмотр событий
- Откройте Просмотр событий, например, одним из следующих способов:
- щелкните правой кнопкой мыши на кнопке “Пуск” → Просмотр событий
- или щелкните левой кнопкой на кнопке “Пуск” → начните вводить “Просмотр событий” → Enter
- в Просмотре событий, перейдите в Журналы Windows → Система
- Выберите последние события с идентификатором события
225
- Под списком событий будет показан путь и идентификатор процесса виновника
.
Ответ или решение
Как определить, какой процесс блокирует файл или папку в Windows?
Работа с файлами и папками в операционной системе Windows иногда может осложняться ситуациями, когда система выдает сообщение о невозможности завершения действия из-за того, что файл или папка открыты в другой программе. Это нередко создает проблемы, особенно когда необходимо удалить файл или папку. Рассмотрим различные методы, которые помогут выяснить, какой именно процесс блокирует файл или папку.
Теория
В операционных системах Windows файлы и папки могут блокироваться различными процессами и приложениями, которые используют их для выполнения своих функций. Это означает, что операционная система предотвращает доступ к таким элементам, чтобы избежать потери данных или повреждения файлов, если они будут одновременно изменяться несколькими процессами.
Пример
Предположим, вы пытаетесь удалить файл, но получаете сообщение о том, что файл используется другой программой. Такое сообщение может выглядеть как "Действие не может быть завершено, потому что файл (или папка) открыт в другой программе". Это свидетельствует о том, что в данный момент с файлом работает какой-то процесс, и этот процесс удерживает файл в состоянии блокировки.
Применение
Метод 1: Использование PowerShell
В Windows можно использовать PowerShell для определения процессов, блокирующих файл. Вот пример команды, которую можно выполнить:
if ((Test-Path -Path $FileOrFolderPath) -eq $false) {
Write-Warning "File or directory does not exist."
} else {
$LockingProcess = CMD /C "openfiles /query /fo table | find /I ""$FileOrFolderPath"""
Write-Host $LockingProcess
}
Примечание: Для использования команды openfiles
необходимо включить поддержку локальных файлов, запустив openfiles /local on
и перезапустив компьютер.
Метод 2: Resource Monitor
- Откройте Resource Monitor через меню Пуск или через Диспетчер задач (вкладка "Производительность").
- Перейдите на вкладку CPU.
- В секции Processes выберите все процессы.
- В секции Associated Handles введите путь к файлу для поиска. Вы увидите, какие процессы заблокировали файл.
Метод 3: Process Explorer
Используйте инструмент Process Explorer от SysInternals:
- Перейдите в меню Find и выберите Find Handle or DLL.
- Введите имя файла и нажмите Search. Process Explorer покажет все процессы, которые открыли файл.
Метод 4: LockHunter и альтернативы
LockHunter — это бесплатный инструмент, который позволяет разблокировать файловые ресурсы. Он интегрируется в меню проводника и удаляет файлы в корзину, позволяя восстановить их при ошибке. Также стоит упомянуть такие утилиты, как OpenedFilesView от NirSoft и EMCO UnlockIT, которые имеют схожую функциональность.
Метод 5: Handle Utility
SysInternal’s handle utility подходит для работы с командной строкой и показывает, какие процессы удерживают файл:
handle -a "C:\temp\test.txt"
Метод 6: Microsoft PowerToys File Locksmith
Microsoft PowerToys File Locksmith — это обновленный инструмент, позволяющий быстро получить информацию о том, кто блокирует файл или папку. Воспользуйтесь этим инструментом, чтобы быстро определить процесс, удерживающий файл.
Эти методы помогут вам понять, какой процесс блокирует ваш файл, и предпринять соответствующие действия для разблокировки. Выбор метода зависит от ваших предпочтений и технических навыков, однако каждый из них может стать полезным в решении этой проблемы.