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

這是在管理員命令提示字元下,我甚至將目錄的所有權限設定為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 deniedrmdir /s有效。嗯...我不知道。它可能是一個向後相容性的問題、一個 Unix 相容性的問題、一個錯誤、一個有意的設計決策(/s畢竟,使用確實有一個「你確定嗎?」提示)。我找不到任何對此行為的參考。如果有人有更多信息,請告訴我,我會將其添加到答案中。

相關內容