![奇怪的空目錄只能用 rmdir /s 刪除](https://rvso.com/image/1628800/%E5%A5%87%E6%80%AA%E7%9A%84%E7%A9%BA%E7%9B%AE%E9%8C%84%E5%8F%AA%E8%83%BD%E7%94%A8%20rmdir%20%2Fs%20%E5%88%AA%E9%99%A4.png)
我不知何故最終得到了一個空目錄(幾個月前使用 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
:
從所有跡象來看,該目錄完全是空的;我在資源管理器中開啟了隱藏文件和系統文件,但沒有看到任何子目錄或文件,並且 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
在 dir 中執行任何操作都沒有顯示任何內容:
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
該特定目錄(或其任何副本)失敗。
所以我的正式問題是:是什麼導致了這種奇怪的行為?
答案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
畢竟,使用確實有一個「你確定嗎?」提示)。我找不到任何對此行為的參考。如果有人有更多信息,請告訴我,我會將其添加到答案中。