Как я 4 часа удалял одну папку
22:00. Начало
Решил поиграть в ответственного пользователя. Диск D: забит под завязку, папка Загрузки выглядит как археологический раскоп. Нахожу древние залежи: какие-то летсплеи из 2009-го, папки с видео (не спрашивайте) и прочий мусор. Выделяю, жму Shift+Delete. Чувствую себя санитаром леса.
22:05. Первая стадия: Отрицание
Винда выплевывает ошибку. Элемент не найден. В смысле не найден? Я его вижу. Вот он, занимает 4 гигабайта. Пробую зайти внутрь — пускает. Пробую удалить — Не удается найти этот элемент.
Ладно, думаю, классика. Наверное, торрент держит или VLC завис. Закрываю всё. Перезагружаю комп.
22:15. Вторая стадия: Гнев
Перезагрузка не помогла. Папка Очень_важный_файл смотрит на меня с экрана и ехидно ухмыляется.
Окей, Гугл, что за дела? Гугл советует Unlocker. Качаю. Unlocker говорит: Никто эту папку не держит, братан, она чиста.
Пытаюсь удалить через Unlocker. Результат: папка на месте.
Моя жопа начинает нагревать кресло.
22:40. Третья стадия: Торг (PowerShell)
Вспоминаю, что я вообще-то тыжпрограммист. Запускаю PowerShell от админа. Сейчас мы тебя, тварь, удалим через консоль.
Пишу Remove-Item.
Консоль краснеет: ERROR. Нет доступа к папке.
Ага! Права! Это NTFS шалит. Ну, сейчас я расчехлю тяжелую артиллерию.
23:10. Битва титанов: takeown и icacls
Вооружаюсь утилитами для прав доступа.
Ввожу: takeown /F D:\Загрузки /R.
Система бодро рапортует: Успех! Успех!. Доходит до проклятой папки и... Системе не удается найти указанный файл.
Да ты издеваешься? Я же скопировал путь прямо из свойств!
Пробую icacls, пытаюсь выдать права Администраторам.
Ошибка: Сопоставление имен не произведено. Ах да, у меня же русская винда, тут нет группы Administrators, тут Администраторы. Спасибо, Microsoft, за этот чудесный квест с локализацией. Исправляю.
Ошибка: Не удается найти файл.
Я сижу перед монитором. Папка есть. Я могу в нее зайти. Но для системы её нет. Это папка Шрёдингера.
23:45. Четвертая стадия: Депрессия
Я перепробовал всё. Безопасный режим. Chkdsk. Молитвы.
Сижу, тупо смотрю в логи ошибки.
Не удается найти файл: D:\Загрузки\Папка
Стоп. Что это?
В конце имени папки. Маленький. Едва заметный. Пробел.
ПРОБЕЛ В САМОМ КОНЦЕ.
00:00. Пятая стадия: Прозрение (и мат)
Оказывается, я столкнулся с Пространством имён Win32.
Короче, суть: файловая система NTFS (которая на диске) — нормальная, она разрешает пробелы в конце. А вот Win32 API (через который работают Проводник, cmd и почти весь софт) — это древнее зло из 80-х. Оно считает, что пробел в конце — это ошибка, и автоматически подчищает путь перед тем, как искать файл.
В итоге выходит абсурд: я требую удалить объект Папка_с_пробелом, система этот пробел игнорирует, ищет объект Папка, не находит его и говорит мне, что я дурак.
00:15. Экзорцизм
Узнал два способа убить монстра.
Способ 1: Ядерный удар (Robocopy)
Создаешь пустую папку Empty.
Пишешь: robocopy D:\Empty D:\ГлючнаяПапка /MIR
Утилита видит, что исходник пуст, и зеркалирует эту пустоту в цель, стирая всё внутри к чертям, игнорируя Win32 ограничения. Гениально.
Способ 2: Магия префикса
Оказывается, если перед путем написать \\?\, то ты говоришь винде: Заткнись и не обрабатывай путь, передавай в ядро как есть.
Запускаю cmd:
rd /s /q \\?\D:\Загрузки\Очень_важный_файл
Нажимаю Enter. Тишина.
Открываю диск D. Папки нет.
Она исчезла. Как будто и не было.
00:30. Итоги
Я потратил 2.5 часа своей жизни из-за одного пробела.
Мораль сей басни:
- Винда — это 40 лет легаси-кода, склеенного изолентой.
- Никогда не доверяйте ошибке Файл не найден.
- \\?\ — это заклинание, которое должен знать каждый.
Пойду выпью чаю. Или чего покрепче. Всем удачных выходных и чистых дисков.