2008年8月27日星期三

无法删除 NTFS 文件系统卷上的文件或文件夹

本文介绍您可能无法删除 NTFS 文件系统卷上的文件或文件夹的原因,以及如何分析造成此问题的不同原因从而解决此问题。
更多信息
注意:在内部,NTFS 将文件夹作为特殊类型的文件进行处理。因此,本文中的“文件”一词可能指文件,也可能指文件夹。
原因 1:文件使用了 ACL
如果某个文件使用了访问控制列表 (ACL),您可能无法删除该文件。要解决此问题,请更改该文件上的权限。您可能需要拥有这些文件的所有权才能更改权限。

管理员具有取得任何文件所有权的隐含能力,即使未明确向他们授予针对此文件的任何权限也是如此。文件所有者具有修改文件权限的隐含能力,即使未明确向他们授予针对此文件的任何权限也是如此。因此,您可能需要取得对某个文件的所有权,赋予自己删除文件的权限,然后才能删除文件。
由于文件使用了不规范的 ACL 而无法使用某些安全工具来显示或修改权限
要变通解决此问题,请使用另一种工具(例如,Cacls.exe 的更新版本)。

根据所属类型,ACL 中的访问控制项 (ACE) 有特定的优先顺序。例如,拒绝访问的 ACE 一般位于授予访问权的 ACE 之前。不过,我们无法防止某个程序编写按任意顺序安排 ACE 的 ACL。在 Windows 的一些早期版本中,当 Microsoft Windows 尝试读取这些“不规范”的 ACL 时会出现问题。有时,无法通过使用 Microsoft Windows 资源管理器图形化安全编辑器正确修改这些 ACL。此问题在 Windows 的更高版本中得到了纠正。如果您遇到了此问题,请使用最新版本的 Cacls.exe。即使无法显示或编辑一个现有的 ACL,也可以编写一个允许您访问该文件的新 ACL。
原因 2:该文件正在使用
如果文件正在使用中,则可能无法将其删除。要解决此问题,请确定具有打开句柄的进程,然后关闭此进程。

根据文件的打开方式(例如,以独占访问而不是共享访问方式打开),您可能无法删除使用中的文件。无论何时,您都可以使用多种工具来帮助确定拥有文件的打开句柄的进程。 要进一步了解可帮助确定拥有文件打开句柄的进程的工具,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 242131 (http://support.microsoft.com/kb/242131/) 如何显示具有已打开文件的进程的列表 172710 (http://support.microsoft.com/kb/172710/) 如何使用 Windows NT 4.0 资源工具包中的 OH 工具 此问题的症状可能多种多样。您可以使用“删除”命令来删除一个文件,但在打开该文件的进程释放该文件之前,该文件实际上并未删除。另外,您可能无法访问正在删除中的文件的“安全”对话框。要解决此问题,请确定具有打开句柄的进程,然后关闭此进程。
原因 3:文件系统损坏使您无法访问此文件
如果文件系统被破坏,则可能无法删除此文件。要解决此问题,请在磁盘卷上运行 Chkdsk 实用工具以纠正任何存在的错误。

磁盘上的坏区、其他硬件故障或者软件错误都可能会损坏文件系统,使文件出现问题。典型操作失败的方式可能各不相同。当文件系统检测到有损坏时,它将在事件日志中记录一个事件,而且您通常会收到一条提示您运行 Chkdsk 的消息。根据损坏的性质,Chkdsk 可能能够也可能无法恢复文件数据;不过,Chkdsk 可以使文件系统返回到一种在内部一致的状态。 有关如何使用 Chkdsk 实用工具的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 176646 (http://support.microsoft.com/kb/176646/) 错误消息:The file or directory is corrupt...(文件或目录已损坏...) 187941 (http://support.microsoft.com/kb/187941/) 对 CHKDSK 和新的 /C 和 /I 开关的解释
原因 4:文件位于比 MAX_PATH 字符更深的路径中
如果文件路径存在问题,则可能无法打开、编辑或删除该文件。
解决方案 1:使用自动生成的 8.3 名称访问该文件
要解决此问题,您可能需要使用自动生成的 8.3 名称访问该文件。如果路径深的原因是文件夹名称太长,则这可能是最简便的解决方案。如果 8.3 路径也太长,或者 8.3 名称已在该卷上被禁用,则请转到解决方案 2。 有关在 NTFS 卷上禁用 8.3 文件名的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 121007 (http://support.microsoft.com/kb/121007/) 如何在 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 保留名称检查。例如,如果在 Windows XP 中使用 Del 命令,则在使用以下特定的语法指定该文件的完整路径的情况下,可以删除名为“lpt1”的文件: del \\?\c:\path_to_file\lpt1有关在 Windows NT 和 Windows 2000 下删除具有保留名称的文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 120716 (http://support.microsoft.com/kb/120716/) 如何在 Windows 中删除具有保留名称的文件 有关在 Windows XP 下删除具有保留名称的文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 315226 (http://support.microsoft.com/kb/315226/) 如何在 Windows XP 中删除具有保留名称的文件 如果使用典型的 Win32 CreateFile 机制打开到某个文件的句柄,则某些文件名称是为旧式 DOS 设备保留的。为了向后兼容,不允许使用这些文件名,也不能使用典型的 Win32 文件调用来创建它们。不过,此问题并不是 NTFS 的一种限制。

通过使用遍历超过 MAX_PATH 的文件夹时所用的那种技巧,您或许能够使用 Win32 程序绕过在创建(或删除)文件时执行的典型名称检查。另外,有些 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 命令以及同一“\\?\”语法来删除此文件。

没有评论: