以下資料出處來自http://support.microsoft.com/kb/320081/zh-tw

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

原因 1:檔案使用 ACL

如果檔案使用「存取控制清單」(ACL),您就無法刪除檔案。如果要解決這個問題,請變更檔案的使用權限。您必須取得檔案的擁有權,才能變更使用權限。

即使系統管理員並未明確地授與檔案的使用權限,他們還是可以取得檔案的擁有權。儘管並未明確地授與檔案的使用權限給檔案擁有者,他們仍擁有修改檔案的權限。因此,您必須取得檔案的擁有權,並賦予自己刪除檔案的權限,然後才能刪除檔案。

由於檔案具有非規範 ACL,因此您無法使用特定的安全性工具來顯示或修改權限

如果要解決這個問題,請使用其他工具 (例如 Cacls.exe 的較新組建)。

ACL 中的存取控制項目 (ACE) 會依照不同的類型,採用特定偏好的順序。例如,拒絕存取的 ACE 通常會排在授與存取的 ACE 前面。然而,程式還是會以任意的順序撰寫具有 ACE 的 ACL。在某些 Windows 的較舊版本中,當 Microsoft Windows 嘗試讀取這些「非規範」(Non-canonical) ACL 時,就會發生問題。有時您會無法使用 Microsoft Windows 檔案總管圖形安全性編輯器,正確地修改這些 ACL。這個問題已經在 Windows 較新的版本中獲得修正。如果您遇到這個問題,請使用最新版的 Cacls.exe。即使您無法適當地顯示或編輯 ACL,還是可以撰寫新的 ACL,以便取得檔案的存取權。

原因 2:正在使用檔案

如果正在使用檔案,您就無法刪除檔案。如果要解決這個問題,請找出具有開啟控制碼的處理程序,然後結束該處理程序。

根據檔案的開啟方式 (例如,以獨佔的存取開啟檔案,而不是共用存取),您可能會無法刪除使用中的檔案。您可以使用各種不同的工具,隨時找出具有檔案開啟控制碼的處理程序。 如需有關可以找出具有檔案開啟控制碼的處理程序之工具的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
242131  (http://support.microsoft.com/kb/242131/ ) How to: Display a List of Processes That Have Files Open
172710  (http://support.microsoft.com/kb/172710/ ) How to use the OH tool on the Windows NT 4.0 Resource Kit
這個問題的徵狀可能有所不同。您或許可以使用 Delete 命令刪除檔案,但是要在開啟檔案的處理程序釋放檔案之後,才能確實地刪除檔案。此外,您無法存取處於擱置刪除狀態的檔案的 [安全性] 對話方塊。如果要解決這個問題,請找出具有開啟控制碼的處理程序,然後結束該處理程序。

原因 3:檔案系統毀損無法存取檔案

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

硬碟上損毀的磁區、其他錯誤的硬體或軟體中的錯誤都會毀損檔案系統,而檔案也可能會發生問題。各種不同的問題都可能造成正常操作失敗。當檔案系統偵測到損毀時,就會記錄在事件記錄檔中,並且會出現訊息,提示您執行 Chkdsk。視損毀的性質而定,Chkdsk 不一定能夠修復檔案資料,但是可以將檔案系統還原到內部一致的狀態。 如需有關使用 Chkdsk 公用程式的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
176646  (http://support.microsoft.com/kb/176646/ ) Error message: The File or Directory Is Corrupt...
187941  (http://support.microsoft.com/kb/187941/ ) An explanation of CHKDSK and the New /C and /I switches


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

如果檔案路徑出現任何問題,您可能就無法開啟、編輯或刪除檔案。

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

如果要解決這個問題,您可以使用自動產生的 8.3 名稱來存取檔案。如果路徑很長,這個方法會是最簡單的解決方案,因為資料夾名稱太長了。如果 8.3 路徑也很長,而磁碟區上的 8.3 名稱已經停用了,則請參考<解決方案 2>。 如需有關停用 NTFS 磁碟區上 8.3 檔案名稱的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的下列文件:
121007  (http://support.microsoft.com/kb/121007/ ) How to Disable the 8.3 Name Creation on NTFS Partitions

解決方案 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 保留名稱檢查。例如,如果您在 Windows XP 中使用 Del 命令,並且使用下列特殊語法指定檔案的完整路徑,則可以刪除名為「lpt1」的檔案:
del \\?\c:\path_to_file\lpt1
如需有關如何刪除 Windows NT 和 Windows 2000 下含有保留名稱的檔案的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
120716  (http://support.microsoft.com/kb/120716/ ) How to remove files with reserved names in Windows
如需有關如何刪除 Windows XP 下含有保留名稱檔案的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
315226  (http://support.microsoft.com/kb/315226/ ) How to remove files with reserved names in Windows XP
如果您使用一般 Win32 CreateFile 機制開啟檔案的控制碼,就會為舊式 DOS 裝置保留特定檔案名稱。為了回溯相容性 (Backward Compatibility),這些檔案名稱不會被允許,並且無法使用一般 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,仍然會因為原因 6 而無法刪除檔案,因為使用者介面中的 ACL 編輯器無法存取適當的檔案。

在這個情形中,您可以將 Subinacl 公用程式與 /onlyfile 參數 (此公用程式隨附於 Resource Kit 中) 搭配使用,來變更無法加以存取的檔案的擁有權和使用權限,例如:
subinacl /onlyfile "\\?\c:\path_to_problem_file" /setowner=domain\administrator /grant=domain\administrator=F
注意 此命令是一行的命令列,為了方便閱讀,已經加以換行。

此範例命令列修改了含有結尾空格的 C:\path_to_problem_file 檔案,使 domain\administrator 帳戶成為檔案的擁有者,並且讓這個帳戶擁有檔案的完整控制權。現在,您可以使用 Del 命令搭配相同的 "\\?\" 語法來刪除這個檔案。
arrow
arrow
    全站熱搜

    brucebin 發表在 痞客邦 留言(0) 人氣()