我不知怎么弄的,最后得到了一个空目录(几个月前用 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 中文件夹的属性对话框不允许您设置文件夹本身的只读属性,而只能设置其内容。我之前假设文本“仅适用于文件夹中的文件”意味着设置“混合”状态仅适用于内容,但“开”将适用于所有内容(我没有仔细考虑)但它实际上意味着如果你将其设置为“开”或“关”状态,它将仅将所选状态应用于内容,“混合”状态只是说“保持一切原样”。
这解释了我在属性对话框中看到的令人困惑的行为,但它没有解释为什么rmdir
说Access is denied
但rmdir /s
有效。嗯……我不知道。这可能是向后兼容性问题、Unix兼容性问题、错误、有意的设计决策(/s
毕竟使用确实有一个“你确定吗?”提示)。我找不到任何关于此行为的参考。如果有人有更多信息,请告诉我,我会将其添加到答案中。