Как я 4 часа удалял одну папку

Как я 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 часа своей жизни из-за одного пробела.

Мораль сей басни:

  1. Винда — это 40 лет легаси-кода, склеенного изолентой.
  2. Никогда не доверяйте ошибке Файл не найден.
  3. \\?\ — это заклинание, которое должен знать каждый.

Пойду выпью чаю. Или чего покрепче. Всем удачных выходных и чистых дисков.

621
106
88
10
7
7
5
2
1
1
1
505 комментариев