我以某种方式结束了一个空目录(几个月前使用 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.
那是在管理员 cmd 提示符下,我什至将目录上的所有权限设置为Full control
:
种种迹象表明,该目录完全是空的。我在资源管理器中打开了隐藏文件和系统文件,我看不到任何子目录或文件,并且 adir /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 句柄搜索、资源监视器句柄搜索和 Sysinternals 的句柄程序)之后,我在任何地方都看不到打开的句柄。
所以在这一点上,似乎有什么事情发生了,对吧?那么真正奇怪的是,如果我这样做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
这个特定目录(或它的任何副本)失败。
所以我的官方问题是:是什么导致了这种奇怪的行为?
感谢@LPChip 在评论中的出色工作,我相信我现在有了答案。
对
attrib
文件夹本身 (attrib test
) 进行操作表明该文件夹具有只读属性:删除只读属性允许删除文件夹:
创建一个新文件夹并添加只读属性完全复制了该问题:
所以这就是阻止
rmdir
删除文件夹的原因,但仍然存在两个问题:1)为什么不起作用rmdir /s
时起作用rmdir
,以及 2)为什么在属性对话框中更改只读复选框没有任何明显效果?我做了更多的挖掘并了解到Windows中文件夹的属性对话框不允许您设置文件夹本身的只读属性,只能设置其内容。我之前假设文本“仅适用于文件夹中的文件”意味着设置“混合”状态仅适用于内容,但“开启”将适用于所有内容(我没有想到)但它实际上意味着如果你设置它处于“开”或“关”状态,它将仅将所选状态应用于内容,而“混合”状态只是说“保持一切原样”。
这解释了我在属性对话框中看到的令人困惑的行为,但它没有解释为什么
rmdir
说Access is denied
但rmdir /s
有效。嗯……我不知道。它可能是一个向后兼容的东西,一个 Unix 兼容的东西,一个错误,一个有意的设计决定(/s
毕竟使用确实有一个“你确定吗?”提示)。我找不到任何关于这种行为的参考。如果有人有更多信息,请告诉我,我会将其添加到答案中。