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

本文介绍无法删除 NTFS 文件系统卷上的文件或文件夹的原因。 它还有助于解决此问题。

适用于: Windows Server 2012 R2
原始 KB 编号: 320081

注意

在内部,NTFS 将文件夹视为特殊类型的文件。 因此,本文中的“ 文件 ”一词表示文件或文件夹。

原因 1:文件使用 ACL

如果文件使用访问控制列表 (ACL) ,则无法删除文件。 若要解决此问题,请更改对文件的权限。 可能需要获取文件的所有权才能更改权限。

管理员具有获取任何文件的所有权的隐式能力,即使他们尚未显式授予对文件的任何权限。 文件所有者具有修改文件权限的隐式能力,即使他们未显式授予对文件的任何权限。 因此,你可能必须拥有文件的所有权,授予自己删除文件的权限,然后删除该文件。

无法使用某些安全工具来显示或修改权限,因为该文件具有非规范的 ACL

若要解决此问题,请使用其他工具 (例如,Cacls.exe) 的更高版本。

ACL 中的访问控制项 (ACE) 具有特定的首选序列,具体取决于其类型。 例如,拒绝访问的 ACE 通常位于授予访问权限的 ACE 之前。 但是,没有任何内容可阻止程序编写具有任意序列中 ACL 的 ACL。 在某些早期版本的 Windows 中,当 Windows 尝试读取这些非规范 ACL 时,出现了问题。 有时无法使用 Microsoft Windows 资源管理器图形安全编辑器正确修改这些 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.txtAFile.txt 的文件,请注意文件名后面的空格。 如果尝试使用标准 Win32 调用打开第二个文件,请改为打开第一个文件。 同样,如果你有一个文件名仅为空格字符的文件,并且你尝试使用标准 Win32 调用打开它,则改为打开该文件的父文件夹。 在这种情况下,如果尝试更改这些文件的安全设置,则可能无法执行此操作,或者可能会意外更改不同文件上的设置。 如果发生此行为,你可能认为你有权访问实际具有限制性 ACL 的文件。

原因组合

有时,你可能会遇到这些原因的组合。 这会使删除文件的过程更加复杂。 例如,如果你以计算机的管理员身份登录,则可能会遇到 原因 1 (你无权删除文件) 和 原因 5 的组合, (文件名包含一个尾随字符,导致文件访问重定向到其他或不存在的文件) ,并且你无法删除该文件。 如果尝试通过获取文件的所有权并添加权限来解决 原因 1 ,则仍可能无法删除该文件,因为由于 原因 6,用户界面中的 ACL 编辑器无法访问相应的文件。

在这种情况下,可以将 Subinacl 实用工具与开关一起使用 /onlyfile , (此实用工具包含在资源工具包) 中,以更改对其他无法访问的文件的所有权和权限。 下面是一个示例:

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

注意

此命令是为提高可读性而包装的单个命令行。

此示例命令行修改 C:\<path_to_problem_file> 包含尾随空间的文件,以便域\管理员帐户是文件的所有者,并且此帐户对文件拥有完全控制权。 现在,可以使用具有相同 "\\?\" 语法的 Del 命令删除此文件。