您無法刪除 NTFS 檔案系統磁碟區上的檔案或資料夾

本文說明為何無法刪除 NTFS 檔案系統磁碟區上的檔案或資料夾。 它也提供解決此問題的協助。

適用:Windows Server 2012 R2
原始 KB 編號: 320081

注意事項

在內部,NTFS 會將資料夾視為特殊類型的檔案。 因此,本文中的單字 檔案 表示檔案或資料夾。

原因 1:檔案使用 ACL

如果檔案使用 存取控制 清單 (ACL) ,則無法刪除檔案。 若要解決此問題,請變更檔案的許可權。 您可能必須取得檔案的擁有權,才能變更許可權。

系統管理員可以隱含地取得任何檔案的擁有權,即使尚未明確授與檔案的任何許可權也一樣。 檔案擁有者具有修改檔案許可權的隱含能力,即使未明確授與檔案的任何許可權也一樣。 因此,您可能必須取得檔案的擁有權、授與自己刪除檔案的許可權,然後刪除檔案。

您無法使用特定安全性工具來顯示或修改許可權,因為檔案具有非標準 ACL

若要解決此問題,請使用另一個工具 (例如,Cacls.exe) 的後續組建。

存取控制 專案 (ACL 中的 ACL) 會根據其類型,具有特定的慣用序列。 例如,拒絕存取的 ACL 通常會出現在授與存取權的 ACL 之前。 不過,沒有任何專案可防止程式撰寫任何任意序列中具有 ACL 的 ACL。 在某些舊版 Windows 中,當 Windows 嘗試讀取這些非標準 ACL 時發生問題。 有時候您無法使用 Microsoft Windows Explorer 圖形安全性編輯器正確修改這些 ACL。 此問題已在更新版本的 Windows 中更正。 如果您遇到此問題,請使用最新版的 Cacls.exe。 即使您無法就地顯示或編輯 ACL,您也可以撰寫新的 ACL 來取得檔案的存取權。

原因 2:正在使用檔案

如果正在使用檔案,則無法刪除檔案。 若要解決此問題,請判斷具有開啟句柄的進程,然後關閉該進程。

根據檔案的開啟方式,您可能無法刪除正在使用的檔案。 例如,檔案是針對獨佔存取而非共用存取而開啟。 您可以使用各種工具來判斷隨時有檔案開啟句柄的進程。

此問題的徵兆可能會有所不同。 您可以使用 Delete 命令來刪除檔案。 但是,在檔案開啟的進程釋放檔案之前,不會刪除檔案。 此外,您可能無法存取擱置刪除檔案的 [安全性] 對話框。 若要解決此問題,請判斷具有開啟句柄的進程,然後關閉該進程。

原因 3:文件系統損毀導致無法存取檔案

如果檔案系統已損毀,您就無法刪除檔案。 若要解決此問題,請在磁碟區上執行 Chkdsk 公用程式,以更正任何錯誤。

下列原因可能會損毀文件系統,並使檔案處於有問題的狀態:

  • 磁碟上的扇區不正確
  • 其他故障硬體
  • 軟體 Bug

一般作業可能會以各種方式失敗。 當文件系統偵測到損毀時,它會將事件記錄到事件記錄檔,而且您通常會收到提示您執行 Chkdsk 的訊息。 根據損毀的本質,Chkdsk 可能會或可能不會復原檔案數據。 不過,Chkdsk 會將文件系統傳回內部一致的狀態。

原因 4:檔案存在於比MAX_PATH個字元更深的路徑中

如果檔案路徑有問題,您就無法開啟、編輯或刪除檔案。

解決方法 1:使用自動產生的 8.3 名稱來存取檔案

若要解決此問題,您可以使用自動產生的8.3名稱來存取檔案。 如果路徑很深,因為資料夾名稱太長,所以此解析可能是最簡單的解決方法。 如果 8.3 路徑太長,或磁碟區上已停用 8.3 名稱,請移至 解析 2。 如需在NTFS磁碟區上停用8.3檔名的詳細資訊,請參閱 如何在NTFS磁碟分區上停用8.3名稱建立

解決方案 2:重新命名或移動深層資料夾

重新命名資料夾,讓比 更 MAX_PATH 深的目標檔案不再存在。 如果您這樣做,請從根資料夾或其他任何方便的地方開始。 然後重新命名資料夾,使其具有較短的名稱。 如果此步驟無法解決此問題,例如,如果檔案的深層超過 128 個資料夾,請移至 解決方法 4

解決方法 3:將磁碟驅動器對應至路徑結構中的資料夾

將磁碟驅動器對應至目標檔案或資料夾路徑結構內的資料夾。 這個方法會縮短虛擬路徑。

例如,假設您有結構化的路徑,如下所示:

\\ServerName\SubfolderName1\SubfolderName2\SubfolderName3\SubfolderName4\...

在此路徑中,字元總數超過 255 個字元。 若要縮短此路徑的長度為 73 個字元,請將磁碟驅動器對應至 SubfolderName4。

解決方法 4:使用與資料夾一樣深的網路共用

如果解決方案 1、2 和 3 不方便或無法解決問題,請盡可能在資料夾樹狀結構中建立深層的網路共用。 然後存取共用以重新命名資料夾。

解決方案5:使用可周游深層路徑的工具

許多 Windows 程式預期路徑長度上限會短於 255 個字元。 這些程式只會配置足夠的內部記憶體來處理這些一般路徑。 NTFS 沒有此限制,而且可以保留較長的路徑。

如果您在資料夾結構中某個時間點建立已經相當深層的共享,然後使用共用在該點下建立深層結構,您可能會遇到此問題。 在資料夾樹狀結構本機上操作的某些工具可能無法從根目錄開始周游整個樹狀結構。 您可能必須以特殊方式使用這些工具,才能周遊共用。 CreateFile API 檔描述在此情況下周游整個樹狀結構的方法。

一般而言,您可以使用建立檔案的軟體來管理檔案。 如果您的程式可以建立比 MAX_PATH更深的檔案,您通常可以使用相同的程式來刪除或管理檔案。 您通常可以使用相同的共享來刪除在共用上建立的檔案。

原因 5:檔名在 Win32 命名空間中包含保留名稱

如果檔名在 Win32 命名空間中包含保留名稱,例如 lpt1,您就無法刪除檔案。 若要解決此問題,請使用非 Win32 程式重新命名檔案。 您可以使用 POSIX 工具或任何其他使用適當內部語法的工具來使用檔案。

此外,如果您使用特定語法來指定檔案的路徑,您可以使用一些內建命令來略過一般的 Win32 保留名稱檢查。

如果您使用一般 Win32 CreateFile 機制開啟檔案的句柄,某些檔名會保留給舊樣式 DOS 裝置。 基於回溯相容性,不允許這些檔名,而且無法使用一般 Win32 檔案呼叫來建立。 此問題不是NTFS的限制。

您可以使用 Win32 程式,略過在建立或刪除檔案時所執行的一般名稱檢查,方法是使用您用來周游比 MAX_PATH更深之資料夾的相同技巧。 此外,某些 POSIX 工具不會受到這些名稱檢查的約束。

原因 6:檔名在 Win32 命名空間中包含無效的名稱

如果檔名包含無效的名稱,則無法刪除檔案。 例如,檔名具有尾端空格或尾端句點,或檔名僅由空格組成。 若要解決此問題,請使用使用適當內部語法的工具來刪除檔案。 您可以使用 "\\?\" 語法搭配一些工具來操作這些檔案。 以下為範例:

del "\\?\c:\<path_to_file_that contains a trailing space.txt>"

此問題的原因與 原因 4 類似。 如果您使用一般 Win32 語法開啟名稱中有尾端空格或尾端句點的檔案,則會在實際檔案開啟之前移除尾端空格或句點。 例如,您在名為 和 AFile.txt 的相同資料夾中有兩個AFile.txt檔案,請記下檔名後面的空間。 如果您嘗試使用標準 Win32 呼叫開啟第二個檔案,請改為開啟第一個檔案。 同樣地,如果您的檔案名稱只是空格符,而您嘗試使用標準 Win32 呼叫來開啟它,則會改為開啟檔案的父資料夾。 在此情況下,如果您嘗試變更這些檔案上的安全性設定,您可能無法這麼做,或者您可能會意外變更不同檔案上的設定。 如果發生此行為,您可能會認為您具有實際具有限制性 ACL 之檔案的許可權。

原因的組合

有時候,您可能會遇到這些原因的組合。 它可以讓刪除檔案的程式更複雜。 例如,如果您以計算機的系統管理員身分登入,可能會遇到 原因 1 的組合, (您沒有刪除檔案) 和 原因 5 的許可權, (檔名包含後置字元,導致檔案存取重新導向至不同或不存在的檔案) ,而且您無法刪除檔案。 如果您嘗試藉由取得檔案的擁有權並新增許可權來解決 原因 1 ,您可能仍然無法刪除檔案,因為使用者介面中的 ACL 編輯器因 原因 6 而無法存取適當的檔案。

在此情況下,您可以使用 Subinacl 公用程式搭配 /onlyfile 參數 (資源套件) 中包含此公用程式,以變更無法存取之檔案的擁有權和許可權。 以下為範例:

subinacl /onlyfile "\\?\c:\<path_to_problem_file>" /setowner= domain\administrator /grant= domain\administrator=F

注意事項

此命令是為了方便閱讀而包裝的單一命令行。

此範例命令行會 C:\<path_to_problem_file> 修改包含尾端空間的檔案,讓 domain\administrator 帳戶成為檔案的擁有者,而且此帳戶可以完全控制檔案。 您現在可以使用具有相同 "\\?\" 語法的 Del 命令來刪除此檔案。