奇怪的空目录,只能用 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.

这是在管理员 cmd 提示符下,我甚至将目录上的所有权限设置为Full control

在此处输入图片描述

种种迹象表明,该目录完全是空的;我在资源管理器中打开了隐藏文件和系统文件,但看不到任何子目录或文件,也没有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 的句柄程序)后,我没有在任何地方看到打开的句柄。

所以现在看起来好像有什么事情发生了,对吧?那到底是怎么回事真的奇怪的是,如果我这样做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 中文件夹的属性对话框不允许您设置文件夹本身的只读属性,而只能设置其内容。我之前假设文本“仅适用于文件夹中的文件”意味着设置“混合”状态仅适用于内容,但“开”将适用于所有内容(我没有仔细考虑)但它实际上意味着如果你将其设置为“开”或“关”状态,它将仅将所选状态应用于内容,“混合”状态只是说“保持一切原样”。

在此处输入图片描述

这解释了我在属性对话框中看到的令人困惑的行为,但它没有解释为什么rmdirAccess is deniedrmdir /s有效。嗯……我不知道。这可能是向后兼容性问题、Unix兼容性问题、错误、有意的设计决策(/s毕竟使用确实有一个“你确定吗?”提示)。我找不到任何关于此行为的参考。如果有人有更多信息,请告诉我,我会将其添加到答案中。

相关内容