Героями третьего эпизода из сериала про неудаляемое становятся файлы и папки. В первую часть статьи я перенес пост из канала 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. Неудивительно, что применяемое лекарство зависит от заболевания.
Напишите в комментариях, в какой ситуации в последний раз столкнулись с невозможностью удалить файлы и как решали проблему.
После удаления программ Adobe замечал, что иногда невозможно удалить пустую папку из-под них в Program Files. Все права есть, папку никто не использует, однако удалить не получается, а переименовать — без проблем. После перезагрузки ничего не меняется. Удалить получилось только из-под WSL
Кмк кто-то писал в чате инсайдеров, может и вы. ОК, WSL тоже вариант :)
Вчера папка не удалялась, была ошибка «Папка не пуста». Всё перепробовал, но помогла одна программа — Blank And Secure. Удалил таки (перезаписал скорее), но даже не с первого раза.
Я исторически не особо верю заявлениям вида все перепробовал. Равно как нередко предпочитаю разобраться в причине проблемы и найти решение без стороннего ПО. Но понимаю, что иногда просто хочется удалить и пойти дальше.
Проверил в FAR файл с финишным пробелом и папку с двоеточием. Проблем нет. При попытке удалить через F8, ругается «Не удалось переместить в корзину. Не удается удалить указанный файл», но если в этом диалоговом окне выбрать «Удалить», удаление происходит штатно. Если сразу выбрать удаление мимо корзины. у меня повешено на Shift+Del, вообще без проблем.
У кого есть Total Commander, проверьте пожалуйста в нём.
+1
Всю жизнь удалял проблемные файлы и папки FARом Shift+Del, ни разу вопросов не возникало.
удалить не удаляемое — берём утилиту для запуска процессов с правами TI.
например https://github.com/mspaintmsi/superUser/releases
Звучит как панацея, но нет — это поможет только если дело в правах TI. А так, этих утилит вагон и маленькая тележка, ссылка в статье. Ну и кавычек в пути не хватает :)
Помню были проблемы с документами по длинному пути. Что-то вроде год\контрагент\договор\версия и так далее.
Решилось переименовыванием папок высшего уровня в г\контр\дог\вер\ и т.п. :)
Да, в этом случае — вариант. А можно создать символическую ссылку — это я описывал в Как обойти ограничение на длину пути при создании или копировании файла.
метод с архиватором на самом деле самый рабочий. бывали файлы, которые не удалить через cmd никак.
Или можно установить reg скрипт take ownership с tenforums, в два клика продавить права и спокойно удалить нужное.
Свое мнение по этому методу я изложил в статье.
Мне в таких случаях помогала виндусятская проверка диска на ошибки
Не совсем по теме.
Удалял повредившиеся ветки реестра с помощью обычного дистрибутива Windows из PE.
Их не могла прочитать LicenseManager, а права на них поменять не получалось.
После удаления веток они пересоздались службой автоматически.
Проблемные ветки нашёл с помощью Process Monitor.
Удалить «неудаляемое», например, старую папку Windows, можно следующим образом:
открываем командную строку с правами администратора,
выполняем две команды:
takeown /f «D:\windows» /r
icacls «D:\windows» /reset /T
после этого просто удаляем… папку Windows (естественно на диске D:, т.е., в нашем примере, старую)
Часто работаю с приложением для синхронизации папок с облаком Bitrix24. Там какая то штука что файл базы данных с кэшем не удаляется даже если закрыть программу. Помогает только перезагрузка. Там дело не в имени файла, а в том что файл остаётся «открытым на запись» кажется толи системой толи эксплорером, но как снять этот флаг с него без перезагрузки — хз.
Это, скорее, про Как определить, каким приложением занят файл
Недавно отключил OneDrive, чтобы данных не осталось. Но остался один файл.
Пробовал удалять найденными командами (из под админа, конечно). И из powerShell, и из cmd. Проверки диска и OS запускал. Компьютер перезагружал. Не помогало.
Ошибка была странная.
Нашёл такое решение: создать файл с таким же именем, перезаписать им неудаляемый файл, после чего удалить.
Помогло. :)