Я каким-то образом оказался с пустым каталогом (созданным несколько месяцев назад с помощью NodeJS как часть скрипта, который я запустил), который не может быть удален обычным rmdir
. Я могу копировать-вставлять каталог столько раз, сколько захочу, и даже копии останутся неудаляемыми с помощью rmdir
:
C:\testing>dir
Volume in drive C is Local Disk
Volume Serial Number is 8830-C25A
Directory of C:\testing
20/07/2020 04:47 PM <DIR> .
20/07/2020 04:47 PM <DIR> ..
20/07/2020 01:25 PM <DIR> test
0 File(s) 0 bytes
3 Dir(s) 43,126,059,008 bytes free
C:\testing>rmdir test
Access is denied.
Это в командной строке администратора, и я даже установил все разрешения для каталога следующим образом Full control
:
По всем признакам каталог совершенно пуст; я включил скрытые и системные файлы в проводнике и не вижу никаких подкаталогов или файлов, и a dir /a
тоже ничего не показывает:
C:\testing\test>dir /a
Volume in drive C is Local Disk
Volume Serial Number is 8830-C25A
Directory of C:\testing\test
20/07/2020 01:25 PM <DIR> .
20/07/2020 01:25 PM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 43,123,294,208 bytes free
Выполнение attrib
в каталоге ничего не показывает:
C:\testing\test>attrib
File not found - C:\testing\test\*.*
Другая странность заключается в том, что он сообщает мне об этом, Access is denied
когда я пытаюсь это сделать, rmdir
а не The directory is not empty
.
Я также подумал, что какая-то программа может иметь открытый дескриптор для каталога (как бы маловероятно это ни было после копирования-вставки из оригинала). Ну, после проверки всем, что я мог придумать (LockHunter, поиск дескрипторов Process Explorer, поиск дескрипторов Resource Monitor и программа Sysinternals Handle), я не смог найти нигде открытых дескрипторов.
Итак, в этот момент, кажется, что-то происходит, да? Ну, что?Действительностранно, что если я делаю rmdir /s test
(рекурсивное удаление), то все удаляется нормально:
C:\testing>rmdir /s test
test, Are you sure (Y/N)? y
C:\testing>dir
Volume in drive C is Local Disk
Volume Serial Number is 8830-C25A
Directory of C:\testing
20/07/2020 04:58 PM <DIR> .
20/07/2020 04:58 PM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 43,120,893,952 bytes free
Это подразумевает, что внутри действительно что-то есть test
. Что это может быть? Мне действительно любопытно, потому что ничего из того, что я сделал до сих пор, не показало мне ничего полезного. Я просто не могу понять, что вызывает rmdir test
сбой в этом конкретном каталоге (или любых его копиях).
Итак, мой официальный вопрос: что является причиной такого странного поведения?
решение1
Благодаря отличной работе @LPChip в комментариях, я думаю, теперь у меня есть ответ на мой вопрос.
Выполнение действий attrib
с самой папкой ( attrib test
) показало, что папка имеет атрибут «только для чтения»:
C:\testing>attrib test
R C:\testing\test
Снятие атрибута «Только чтение» позволяет удалить папку:
C:\testing>attrib -r test
C:\testing>rmdir test
C:\testing>dir
Volume in drive C is Local Disk
Volume Serial Number is 8830-C25A
Directory of C:\testing
23/07/2020 09:03 AM <DIR> .
23/07/2020 09:03 AM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 43,965,960,192 bytes free
Создание новой папки и добавление атрибута «только для чтения» в точности повторяет проблему:
C:\testing>md test2
C:\testing>attrib +r test2
C:\testing>rmdir test2
Access is denied.
Вот что помешало rmdir
удалить папку, но остаются два вопроса: 1) Почему это rmdir /s
работает, а что rmdir
нет, и 2) почему изменение флажка «Только для чтения» в диалоговом окне свойств не дает никакого видимого эффекта?
Я покопался еще немного инаучилсячто диалог свойств папки в Windows не позволяет вам установить атрибут «только для чтения» для самой папки, только для ее содержимого. Я ранее предполагал, что текст«Применимо только к файлам в папке»означает, что настройка состояния «смешанный» будет применяться только к содержимому, а «вкл.» будет применяться ко всему (я не продумал это), но на самом деле это означает, что если вы установите его в состояние «вкл.» или «выкл.», он применит выбранное состояние только к содержимому, а состояние «смешанный» просто говорит «оставить все как есть».
Это объясняет запутанное поведение, которое я наблюдал в диалоге свойств, но не объясняет, почему rmdir
says Access is denied
but rmdir /s
работает. Ну... я не знаю. Это может быть проблема обратной совместимости, проблема совместимости с Unix, ошибка, намеренное решение дизайна ( /s
в конце концов, using does имеет запрос «Вы уверены?»). Я не могу найти никаких ссылок на это поведение. Если у кого-то есть дополнительная информация, дайте мне знать, и я добавлю ее в ответ.