本文介绍为何无法删除 NTFS 文件系统卷上的文件或文件夹。 它还有助于解决此问题。
原始 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.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>
包含尾随空格的文件,以便域\管理员帐户是文件的所有者,并且此帐户完全控制该文件。 现在,可以使用具有相同 "\\?\"
语法的 Del 命令删除此文件。