Странный пустой каталог, который можно удалить только с помощью rmdir /s

Странный пустой каталог, который можно удалить только с помощью rmdir /s

Я каким-то образом оказался с пустым каталогом (созданным несколько месяцев назад с помощью 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 не позволяет вам установить атрибут «только для чтения» для самой папки, только для ее содержимого. Я ранее предполагал, что текст«Применимо только к файлам в папке»означает, что настройка состояния «смешанный» будет применяться только к содержимому, а «вкл.» будет применяться ко всему (я не продумал это), но на самом деле это означает, что если вы установите его в состояние «вкл.» или «выкл.», он применит выбранное состояние только к содержимому, а состояние «смешанный» просто говорит «оставить все как есть».

введите описание изображения здесь

Это объясняет запутанное поведение, которое я наблюдал в диалоге свойств, но не объясняет, почему rmdirsays Access is deniedbut rmdir /sработает. Ну... я не знаю. Это может быть проблема обратной совместимости, проблема совместимости с Unix, ошибка, намеренное решение дизайна ( /sв конце концов, using does имеет запрос «Вы уверены?»). Я не могу найти никаких ссылок на это поведение. Если у кого-то есть дополнительная информация, дайте мне знать, и я добавлю ее в ответ.

Связанный контент