Героями третьего эпизода из сериала про неудаляемое становятся файлы и папки. В первую часть статьи я перенес пост из канала Telegram, а остальное написал по мотивам вопросов читателей.
[+] Сегодня в программе
Как удалить файл или папку с очень длинным путем либо с пробелами или точками в конце имени
Коллега спросил, не помню ли я как это делается. Я много чего помню, но точный синтаксис команд регулярно забываю. Поэтому я пишу такие вещи в блог или канал – это мои публичные записные книжки.
Есть несколько вариантов, и я начну с наглядного решения.
Добавление в архив с удалением
Это креативный и простой способ для пользователей, у которых не получается в командной строке.
Добавьте файл или папку в архив 7-Zip или WinRAR с опцией «Удалить файлы после сжатия».
Очевидно, архиваторы не испытывают проблем с длинными путями, потому что избегают их обработки в API Windows при работе с файлами и папками.
Путь с префиксом \\?\
Примеры удаления папки и файла из командной строки:
- Файл с очень длинным путем
del "\\?\C:\full-path.txt"
- Файл с пробелом в конце полного имени
del "\\?\C:\full-path.txt "
- Папка с двумя точками в имени
rd /s "\\?\C:\full-path.."
Сначала идет префикс \\?\
, а затем полный путь к файлу или папке, включая точки или пробелы в конце, если необходимо. Префикс \\?\
используется в пространстве имен файлов Win32. Если он указан, API в Windows не обрабатывают строку с путем, а сразу отправляют ее файловой системе.
Этот метод давно описан в базе знаний Microsoft, а теория есть в документации:
- KB320081: You can’t delete a file or a folder on an NTFS file system volume – в закладки, потому что там описаны и другие причины проблемы с удалением
- Naming Files, Paths, and Namespaces – помимо прочего описывает недопустимые символы ASCII в путях, о чем пойдет речь ниже
В скобках замечу, что вы видели похожий путь \\?\GLOBALROOT
в статьях про восстановление файлов из теневых копий и извлечение копии реестра из точек восстановления. В данном случае драйвер создает символическую ссылку на свое устройство в пространстве имен Win32.
Включение поддержки длинных путей
В Windows 10 1607+ можно включить поддержку длинных путей. Выполните команду от имени администратора и перезагрузитесь.
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1
Теперь в проводнике не должно быть проблем с удалением объектов с длинными путями. В других приложениях – как повезет, ведь они должны реализовать поддержку длинных путей. Однако это не поможет с пробелами и точками в конце пути, а также недопустимыми символами.
Как удалить файл или папку с недопустимым символом в имени
Участник чата инсайдеров Nik попытался применить способы выше для удаления файлов с символом *
в пути, но у него ничего не вышло.
Полный список недопустимых печатных символов ASCII в путях Windows есть в документации↑ Впрочем, его покажет даже проводник при попытке создания файла или папки с недопустимым символом в имени — попробуйте *
или ?
. В данном случае файлы были созданы в Linux, где ограничения намного мягче.
Понятно, что можно загрузиться в Linux и решить вопрос, но речь про Windows. При удалении в командной строке командами del или rd будет такой же отлуп, как в проводнике при попытке зайти в папку:
del /s /q \\?\C:\temp\*
The file or directory is corrupted and unreadable.
В Windows решение только одно:
chkdsk /f C:
Если том используется, проверка начнется после перезагрузки. Затем можно посмотреть отчет в журнале событий, а также убедиться, что объекты перемещены в скрытую папку вида found.000.
Любопытно, что WSL не создает недопустимые имена в файловой системе Windows, хотя в консоли Linux показывает символы правильно.
Также занятно, что в проводнике «недопустимые» символы из WSL отображаются по-разному в папке и результатах поиска.
Как удалить файл или папку при недостатке прав
Я не люблю менять права, практически никогда этого не делаю и вам не советую. Это медленно, небезопасно, а с кривыми руками бывает больно. Если отбросить ситуацию, когда объект занят процессом, в большинстве случаев нужны права SYSTEM или Trusted Installer.
Запускайте с нужными правами сторонний файловый менеджер или на худой конец блокнот.
Выполнение скриптов от имени системы возможно без сторонних средств. Актуальная подборка утилит для запуска от имени SYSTEM и Trusted Installer давно есть в блоге. Да, статья про управление правами на разделы реестра, но практической разницы с разрешениями файловой системы тут нет.
В неординарных случаях со сложными ACL могут понадобиться icacls или subinacl. И да, про это написано в KB320081.
Заключение
Смешались в кучу кони, люди © Легаси и нововведения в ОС, работа с файловой системой напрямую и Linux, права SYSTEM или TI, и даже кривые ACL. Неудивительно, что применяемое лекарство зависит от заболевания.
Напишите в комментариях, в какой ситуации в последний раз столкнулись с невозможностью удалить файлы и как решали проблему.
Kesantielu Dasefern
После удаления программ Adobe замечал, что иногда невозможно удалить пустую папку из-под них в Program Files. Все права есть, папку никто не использует, однако удалить не получается, а переименовать — без проблем. После перезагрузки ничего не меняется. Удалить получилось только из-под WSL
Vadim Sterkin
Кмк кто-то писал в чате инсайдеров, может и вы. ОК, WSL тоже вариант :)
Zalexanninev15
Вчера папка не удалялась, была ошибка «Папка не пуста». Всё перепробовал, но помогла одна программа — Blank And Secure. Удалил таки (перезаписал скорее), но даже не с первого раза.
Vadim Sterkin
Я исторически не особо верю заявлениям вида все перепробовал. Равно как нередко предпочитаю разобраться в причине проблемы и найти решение без стороннего ПО. Но понимаю, что иногда просто хочется удалить и пойти дальше.
Lecron
Проверил в FAR файл с финишным пробелом и папку с двоеточием. Проблем нет. При попытке удалить через F8, ругается «Не удалось переместить в корзину. Не удается удалить указанный файл», но если в этом диалоговом окне выбрать «Удалить», удаление происходит штатно. Если сразу выбрать удаление мимо корзины. у меня повешено на Shift+Del, вообще без проблем.
У кого есть Total Commander, проверьте пожалуйста в нём.
Alexander Chobot
+1
Всю жизнь удалял проблемные файлы и папки FARом Shift+Del, ни разу вопросов не возникало.
Geepnozeex Gypnorion
удалить не удаляемое — берём утилиту для запуска процессов с правами TI.
например https://github.com/mspaintmsi/superUser/releases
Vadim Sterkin
Звучит как панацея, но нет — это поможет только если дело в правах TI. А так, этих утилит вагон и маленькая тележка, ссылка в статье. Ну и кавычек в пути не хватает :)
Алексей Петровский
Помню были проблемы с документами по длинному пути. Что-то вроде год\контрагент\договор\версия и так далее.
Решилось переименовыванием папок высшего уровня в г\контр\дог\вер\ и т.п. :)
Vadim Sterkin
Да, в этом случае — вариант. А можно создать символическую ссылку — это я описывал в Как обойти ограничение на длину пути при создании или копировании файла.
Алексей
метод с архиватором на самом деле самый рабочий. бывали файлы, которые не удалить через cmd никак.
Alexander Chobot
Или можно установить reg скрипт take ownership с tenforums, в два клика продавить права и спокойно удалить нужное.
Vadim Sterkin
Свое мнение по этому методу я изложил в статье.
Владислав Балякин
Мне в таких случаях помогала виндусятская проверка диска на ошибки
Алексей Каманин
Не совсем по теме.
Удалял повредившиеся ветки реестра с помощью обычного дистрибутива Windows из PE.
Их не могла прочитать LicenseManager, а права на них поменять не получалось.
После удаления веток они пересоздались службой автоматически.
Проблемные ветки нашёл с помощью Process Monitor.
Сергей
Удалить «неудаляемое», например, старую папку Windows, можно следующим образом:
открываем командную строку с правами администратора,
выполняем две команды:
takeown /f «D:\windows» /r
icacls «D:\windows» /reset /T
после этого просто удаляем… папку Windows (естественно на диске D:, т.е., в нашем примере, старую)
Джонни
Часто работаю с приложением для синхронизации папок с облаком Bitrix24. Там какая то штука что файл базы данных с кэшем не удаляется даже если закрыть программу. Помогает только перезагрузка. Там дело не в имени файла, а в том что файл остаётся «открытым на запись» кажется толи системой толи эксплорером, но как снять этот флаг с него без перезагрузки — хз.
Vadim Sterkin
Это, скорее, про Как определить, каким приложением занят файл
Aleksey Prikhodko
Недавно отключил OneDrive, чтобы данных не осталось. Но остался один файл.
Пробовал удалять найденными командами (из под админа, конечно). И из powerShell, и из cmd. Проверки диска и OS запускал. Компьютер перезагружал. Не помогало.
Ошибка была странная.
Нашёл такое решение: создать файл с таким же именем, перезаписать им неудаляемый файл, после чего удалить.
Помогло. :)