不能删除 NTFS 文件系统卷上的文件或文件夹

本文介绍了为什么无法删除 NTFS 文件系统卷上的文件或文件夹。 它还提供了解决此问题的帮助。

原始产品版本:   Windows Server 2012 R2
原始 KB 编号:   320081

备注

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

原因 1:文件使用 ACL

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

管理员具有获得任何文件所有权的隐式功能,即使他们尚未明确获得对该文件的任何权限。 文件所有者具有修改文件权限的隐式功能,即使他们未明确授予对文件的任何权限。 因此,你可能需要获得文件的所有权,为自己授予删除文件的权限,然后删除文件。

由于文件具有非规范 ACL,因此不能使用某些安全工具来显示或修改权限

若要解决此问题,请使用另一个 (,例如,更高版本的 Cacls.exe) 。

ACL 中的访问控制项 (ACL) 具有特定的首选顺序,具体取决于它们的类型。 例如,拒绝访问的 AES 通常先于授予访问权限的 AES。 但是,没有任何内容会阻止程序编写具有任意顺序的 AES 的 ACL。 在某些早期版本的 Windows 中,当 Windows 尝试读取这些非规范 ACL 时,出现了问题。 有时,你无法通过使用 Microsoft Windows 资源管理器图形安全编辑器正确修改这些 ACL。 This issue has been corrected in later versions of 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 个字符。 若要缩短此路径的长度,将驱动器映射到 SubfolderName4,即 73 个字符。

解决方案 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 语法打开文件名中具有尾随空格或尾随句点的文件,则在实际文件打开之前将去除尾随空格或句点。 例如,在名为 and 的同一文件夹中有两个文件,请注意文件名 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

备注

此命令是一个命令行,为了可读性,它已被包装。

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