De alguma forma, acabei com um diretório vazio (criado há alguns meses com o NodeJS como parte de um script que executei) que não pode ser excluído com um arquivo rmdir
. Posso copiar e colar o diretório quantas vezes quiser e até mesmo as cópias permanecerão indeléveis com 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.
Isso está em um prompt de cmd do administrador e até defino todas as permissões no diretório para Full control
:
Ao que tudo indica, o diretório está totalmente vazio; Ativei os arquivos ocultos e do sistema no Explorer e não vejo subdiretórios ou arquivos, e dir /a
também não mostra nada:
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
Fazendo attrib
no diretório não mostra nada:
C:\testing\test>attrib
File not found - C:\testing\test\*.*
A outra coisa estranha é que está me dizendo Access is denied
quando tento, em rmdir
vez de The directory is not empty
.
Também considerei que algum programa pode ter um identificador aberto para o diretório (o mais improvável é depois de copiar e colar do original). Bem, depois de verificar com tudo o que pude pensar (LockHunter, pesquisa de identificadores do Process Explorer, pesquisa de identificadores do Monitor de recursos e programa Handle da Sysinternals), não consegui ver identificadores abertos em nenhum lugar.
Então, neste ponto, parece que algo está acontecendo, certo? Bem, o que é realmente estranho é que, se eu fizer rmdir /s test
(exclusão recursiva), ele excluirá bem:
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
Isso implica que realmente há algo dentro de test
. O que poderia ser? Estou muito curioso, porque nada do que fiz até agora me mostrou algo útil. Simplesmente não consigo descobrir o que está causando rmdir test
a falha neste diretório específico (ou em qualquer cópia dele).
Então, minha pergunta oficial: o que está causando esse comportamento bizarro?
Graças ao excelente trabalho de @LPChip nos comentários, acredito que agora tenho minha resposta.
Fazendo
attrib
na própria pasta (attrib test
) revelou que a pasta tinha um atributo somente leitura:A remoção do atributo somente leitura permite que a pasta seja excluída:
Criar uma nova pasta e adicionar o atributo somente leitura replica o problema exatamente:
Então foi isso que impediu
rmdir
a remoção da pasta, mas duas perguntas permanecem: 1) Por quermdir /s
funciona quandormdir
não funciona e 2) por que alterar a caixa de seleção somente leitura no diálogo de propriedades não tem nenhum efeito aparente?Pesquisei um pouco mais e descobri que o diálogo de propriedades de uma pasta no Windows não permite que você defina o atributo somente leitura da própria pasta, apenas seu conteúdo. Presumi anteriormente que o texto "Aplica-se apenas a arquivos na pasta" significava que o estado "misto" se aplicaria apenas ao conteúdo, mas "ligado" se aplicaria a tudo (não pensei nisso), mas na verdade significa que se você definir para o estado "ligado" ou "desligado", ele aplicará o estado escolhido apenas ao conteúdo, e o estado "misto" está apenas dizendo "deixe tudo como está".
Isso explica o comportamento confuso que eu estava vendo com o diálogo de propriedades, mas não explica por que
rmdir
diz,Access is denied
masrmdir /s
funciona. Bem... não sei. Pode ser uma coisa de compatibilidade com versões anteriores, uma coisa de compatibilidade com Unix, um bug, uma decisão de design intencional (/s
afinal, usar tem um prompt "tem certeza?"). Não consigo encontrar nenhuma referência a esse comportamento. Se alguém tiver mais informações, me avise e adicionarei à resposta.