Іноді при спробі видалити, перейменувати або перемістити якийсь файл в 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.

Файл вже використовується.  Дія не може бути виконано, так як цей файл відкритий в System

Спробуємо розібратися, як зрозуміти якою програмою, службою або системним процесом Windows зайнятий файл, як розблокувати файл і чи можна розблокувати файл не закриваючи батьківський процес.

Найпростіший варіант розблокувати файл – завершити процес, які його заблокував. Але це не завжди можливо, особливо на серверах.

Найчастіше для пошуку процесу, який заблокував файл рекомендують використовувати утиліту Розблокувач. Особисто я Unlocker не використовую, тому що вона не дозволяє отримати детальну інформацію про процес або ланцюжку процесів, які заблокували файл. Також не можна звільнити конкретний файл, зайнятий процесом – доводиться завершувати додаток цілком.

Крім того, це стороння утиліта, при установці якої потрібно бути уважним, тому що в процесі вона пропонує встановити пачку непотрібні програми в навантаження.

Коли процес в Windows відкриває файл, цього потоку введення / виведення призначається файловий дескриптор (handler). Процес і його дочірні процеси отримують доступ до файлу з цього дескриптора. Через Window API ви можете надіслати сигнал файлової системи на звільнення даного дескриптора та розблокування з файлу.

Примусове закриття файлових дескрипторів може викликати нестабільну роботу додатка або комп’ютера. Якщо ви не знаєте, до чого призведе закриття дескриптора файлу для конкретного додатка, то не намагайтеся виконати це на продуктивному сервері без попереднього тесту.

Як розблокувати файл за допомогою Process Explorer?

ProcessExplorer це безкоштовна утиліта з набору системних утиліт Sysinternals, яку можна завантажити на сайті Microsoft (https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer). Спробуємо за допомогою Process Explorer визначити, який процес заблокував певний файл і звільнити цей файл, скинувши файловий дескриптор процесу.

  1. ProcessExplorer не вимагає установки, просто скачайте розпакуйте і запустіть з правами адміністратора procexp.exe;
  2. Виберіть меню Знайдіть -> Знайдіть Handle або DLL (Або натисніть Ctrl-F); proc explorer - пошук відкритих файлів
  3. Вкажіть ім’я файлу, який потрібно розблокувати і натисніть Пошук;
  4. Виберіть потрібний файл. Процес, який відкрив файли буде виділено в дереві процесів. Можна завершити цей процес, клацнувши по ньому правою кнопкою і вибравши Дерево процесу вбивства. Але можна спробувати закрити дескриптор файлу, але не завершити процес цілком. Дескриптор файлу, який ви шукали, автоматично виділяється в нижній панелі Process Explorer. Клацніть по дескриптору правою кнопкою і виберіть Закрийте ручку. Підтвердіть закриття файлу. process explorer знайти і завершити дескриптор процесу

    Якщо у вас в Process Explorer не відображається нижня панель зі списком відкритих дескрипторів процесу, включите пункт меню View -> Lower Pane View -> Handles

Отже, ви закрили дескриптор файлу, але не завершити батьківський процес. Тепер ви можете спокійно видалити або перейменувати файл.

Скидання дескриптора файлу за допомогою утиліти Handle

Ручка – це ще одна утиліта командного рядка з комплекту інструментів Sysinternals (доступна для скачування на сайті Microsoft (https://docs.microsoft.com/en-us/sysinternals/downloads/handle. Вона дозволяє знайти процес, який заблокував ваш файл і зняти блокування, звільнивши дескриптор.

  1. Скачайте і розпакуйте архів з утилітою Handle;
  2. Запустіть командний рядок з правами адміністратора і виконайте команду: handle64.exe > listproc.txt утиліта Handle.exe  Дана команда збереже список відкритих дескрипторів в файл. Можна вивести дескриптори для каталогу, в якому знаходиться файл, який ви хочете змінити: Handle64.exe -a C:SomePath або конкретного процесу: handle64.exe -p winword.exe
  3. Відкрийте файл listproc.txt в будь-якому текстовому редакторі і знайдіть рядок, в якій зазначено ім’я заблокованого файлу. Скопіюйте Посвідчення особи дескриптора файлу (значення в hex форматі). Потім підніміться трохи вище до розділу, в якому вказано процес, який є власником даного дескриптора і запишіть його ID. Для процесу запущеного від імені системи швидше за все буде PID 4. список відкритих дескрипторів файлів в windows
    Для деяких системних процесів handle.exe поверне наступний текст: wininit.exe pid: 732 <unable to open process>. Це означає, що ви не може отримати інформацію про ці системні процеси (навіть з правами адміністратора). Для отримання дескрипторів файлів, відкритих такими процесами, запустіть командний рядок з правами System і спробуйте отримати список дескрипторів ще раз.
  4. Тепер поверніться в командний рядок і скиньте дескриптор файлу за отриманими HandleID і ProcessID. Формат команди наступний: handl64e.exe -c HandleID -p ProcessID наприклад: handl64e.exe -c 18C -p 18800 handl64e - закрити дескриптор відкритого файлу
  5. Утиліта запросить підтвердити закриття файлу для вказаного процесу. Підтвердіть, натиснувши y -> enter

Якщо система відреагує на закриття файлу коректно, ви розблоковуєте ваш файл без необхідності завершувати процес або перезавантажувати сервер / комп’ютер.

Leave a Reply

Your email address will not be published. Required fields are marked *