Узнайте, какой процесс блокирует файл или папку в Windows.

Вопрос или проблема

Как я могу узнать, какой процесс блокирует файл или папку в 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!

  1. Откройте Диспетчер ресурсов, который можно найти
    • Поиск по Диспетчер ресурсов или resmon.exe в меню “Пуск”, или
    • Как кнопку на вкладке Производительность в вашем Диспетчере задач
  2. Перейдите на вкладку ЦП
  3. В разделе Процессы выберите все процессы, нажав на чекбокс рядом с “Изображением” в заголовках.
  4. Используйте поле поиска в разделе Связанные дескрипторы
    • Смотрите синюю стрелку на скриншоте ниже

Когда вы найдете дескриптор, вы можете идентифицировать процесс, посмотрев на столбец “Изображение” и/или PID.

Затем вы можете попытаться закрыть приложение, как обычно, или, если это невозможно, просто щелкните правой кнопкой мыши по дескриптору и завершите процесс прямо оттуда. Легко и просто!

Скриншот диспетчера ресурсов

Несколько вариантов:

Microsoft/SysInternals Process Explorer – Перейдите в Найти > Найти дескриптор или DLL. В текстовом поле “Дескриптор или подстрока DLL:” введите путь к файлу (например, “C:\path\to\file.txt”) и нажмите “Поиск”. Все процессы, у которых открыт дескриптор этого файла, должны быть перечислены.

WhoLockMe – Расширение для проводника, добавляющее опцию в контекстное меню правой кнопки мыши

Замечание. WhoLockMe, похоже, не работает с Windows 10 (по крайней мере, я не смог зарегистрировать его ни с 32-, ни с 64-битными версиями regsvr32.exe).

Посмотрите на Process Explorer (procexp.exe).

Из введения:

Вам когда-нибудь было интересно, какая программа открыла конкретный файл или каталог? Теперь вы можете это узнать.

Чтобы выяснить, какой процесс использует конкретный файл, следуйте этим шагам:

  1. Перейдите в Найти, Найти дескриптор или DLL.. или просто нажмите Ctrl+F.

    Введите описание изображения здесь

  2. Введите имя файла и нажмите Поиск.

    Введите описание изображения здесь

  3. Process Explorer покажет все процессы, у которых есть открытый дескриптор к файлу. Щелкните по записи, чтобы сфокусироваться на процессе в основном окне.

    Введите описание изображения здесь

  4. Если хотите, вы можете даже закрыть дескриптор вручную через нижнюю панель (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
  1. Откройте Resource Monitor через меню Пуск или через Диспетчер задач (вкладка "Производительность").
  2. Перейдите на вкладку CPU.
  3. В секции Processes выберите все процессы.
  4. В секции Associated Handles введите путь к файлу для поиска. Вы увидите, какие процессы заблокировали файл.
Метод 3: Process Explorer

Используйте инструмент Process Explorer от SysInternals:

  1. Перейдите в меню Find и выберите Find Handle or DLL.
  2. Введите имя файла и нажмите 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 — это обновленный инструмент, позволяющий быстро получить информацию о том, кто блокирует файл или папку. Воспользуйтесь этим инструментом, чтобы быстро определить процесс, удерживающий файл.

Эти методы помогут вам понять, какой процесс блокирует ваш файл, и предпринять соответствующие действия для разблокировки. Выбор метода зависит от ваших предпочтений и технических навыков, однако каждый из них может стать полезным в решении этой проблемы.

Оцените материал
Добавить комментарий

Капча загружается...