Отложенное удаление (переименование) файлов в Windows


Бывает иногда нужно удалить файл, но он занят каким-то процессом. При попытке удаления Explorer ругается, что файл используется. Если процесс "неважный", то его можно удалить при помощи Диспетчера Задач, и, возможно, появится возможность работать с файлом. Но если файл используется системным процессом, то такой подход вряд ли сработает ;-) - даже не стоит его пробовать.
В этом случае можно попробовать удалить файл (или переименовать/переместить его) используя фичу ОС - определенное выполнение операций с фалами до полной загрузки системы и запуска всех процессов. Выполнить это можно при помощи параметра в реестре PendingFileRenameOperations.
Нужно в редакторе реестра (regedit) открыть ключ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager и создать под ним мультистроковый параметр (меню Правка/Создать/Мультистроковый параметр) PendingFileRenameOperations. Далее, нужно открыть этот параметр на редактирование (двойным щелчком мыши), и ввести в окне значений "файловые пАры". "Файловая пара" - это две строки: на одной - текущий путь к файлу, на второй - новое значение, куда его нужно переместить/переименовать. При этом значения путей должны начинаться с префикса \??\ . И, если нужно просто удалить файлы, то вторая строка в паре должна быть пустой (кое-где, например, здесь, почему-то предлагают вносить пары через пробел, а потом менять в двоичном виде знак пробела на код 0000, но, по-моему, всё работает успешно и с простым переносом строк).
Таким образом, например, значение, которое выглядит так:

\??\C:\test.txt

\??\C:\test1.txt
\??\C:\test1.bak
\??\C:\test2.txt
\??\C:\temp\test2.txt

приведет к следующим последствиям:

  • файл C:\test.txt будет удален
  • файл C:\test1.txt будет переименован в test1.bak
  • файл C:\test2.txt будет перенесен из корневого каталога C:\ в C:\temp\

После редактирования ресстра, конечно, нужно перезагрузить компьютер.


Нравится