- 无法删除文件或文件夹的原因和解决方法
-
发布时间:2010-06-22 13:35:01
发布时间:2010-06-22 13:35:01
在我们使用Windows的过程中,会遇到各种各样的问题。即使是最简单的删除文件也可能遇到麻烦,要么系统提示“文件正在被另一个人或程序使用”,要么就是报告“访问被拒绝”。这种情况多数是出自NTFS系统结构上的,这是NTFS系统的“集权制”的结果。 本文介绍以下两方面内容:为什么您可能无法删除 NTFS 卷上的文件或文件夹,以及如何解决造成此问题的各种不同原因以消除此问题。 一般文件夹不能删除有以下几种情况: 1、文件夹本身有文件正在使用 在删除文件时,经常会遇到的一个问题是,文件正在使用,无法删除。如果试图删除以独占访问而不是以共享访问方式打开,并且正在使用中的文件时,系统就会出现错误提示:“无法删除××××××:文件正在被另一个人或程序使用”。而另一种情况则是,能够使用删除命令删除文件,但在打开文件的进程释放该文件之前,文件实际上并未删除。 要解决上述问题,需要确定拥有文件打开句柄的进程,然后关闭此进程。在以前的Windows中,我们可以使用资源工具包的Oh.exe。但在XP中,安装好的Support Tools却不带Oh.exe。不过,XP提供了一个新的Openfiles.exe命令行工具,它能够报告进程打开的各个文件。与Oh.exe相似,Openfiles.exe也要求打开系统内核监视,这会消耗一些内存,并降低系统操作的性能。打开系统监视的命令是“Openfiles /local on”,它会启用系统全局标志“维护对象列表”,需重新启动系统才能生效。重新启动系统后,在命令提示符下执行不带参数的“Openfiles”,即可看到各个进程打开文件的清单。 2、文件系统损坏 磁盘上的坏区、其他硬件故障或者软件错误都可能会损坏文件系统,使文件出现问题而无法删除。典型操作失败的方式可能各不相同,当检测到文件系统损坏时,通常会收到一条提示运行Chkdsk的信息。 如果遇到这种情况,可以在磁盘卷上运行Chkdsk实用工具以纠正任何存在的错误。根据损坏的性质,Chkdsk也许能够恢复文件数据,也许无法恢复,但Chkdsk可以使文件系统返回到一种在内部一致的状态。有关Chkdsk实用工具的命令及参数,可以在命令提示符下执行“Chkdsk /?”查阅。 3、文件使用了存取控制列表 如果某个文件使用了存取控制列表(Access Control List,简称ACL),而操作者又没有相应的权限,那么删除文件时就可能出现“访问被拒绝”的提示(如图3)。 通常情况下,管理员具有取得任何文件所有权的隐含能力,文件所有者也具有修改文件权限的隐含能力。不过,这些默认的权限是可以被修改的。 要解决因ACL导致文件无法删除的问题,就必须以具有相应权限的用户身份登录,或者是赋予自己删除文件的权限,然后才能删除文件。要注意的是,操作者必须拥有这些文件的所有权才能更改权限。如果是因为文件使用了不规范的ACL而不能使用某些安全工具显示或修改其权限时,可以尝试使用命令行工具Cacls.exe进行修改。 4、文件名使用了一个保留名称 众所周知,像AUX、LPT1这样的名称是为旧式DOS设备保留的。为了向后兼容,在Windows中不允许使这些文件名,也不能使用典型的Win32文件调用来创建它们。反之,如果文件名是Win32命名空间中的一个保留名称,则同样可能无法删除此文件。 要解决此类问题,可以在Linux或其他非Windows的操作系统下重命名或删除该文件。另外,如果能够使用特定的语法指定到该文件的路径,也可以使用一些内置的命令绕过典型的Win32保留名称检查。例如,在Windows XP中使用以下命令,可以删除名为“lpt1”的文件(Del命令后面加上“\\?\”来避免Windows检查文件名的合法性): Del \\?\c:\文件路径\lpt1 5、无效的文件名称 如果文件名中包括一个无效名称,例如文件名有一个尾随空格,或一个尾随句点,或者文件名仅由一个空格组成,同样可能无法删除该文件。值得一提的是,如果使用典型的Win32语法打开名称中有尾随空格或尾随句点的文件,则尾随空格或句点在打开实际文件之前会被去掉。因此,如果在同一个文件夹中有两个分别名为“File.txt”和“File.txt ”的文件(注意第二个文件名后面的空格),当使用标准Win32调用打开第二个文件时,实际上会打开第一个文件。同样,如果文件的名称仅是“ ”(一个空格字符),当尝试使用标准Win32调用打开它时,实际上会打开该文件的父文件夹。在此情况下,如果尝试更改这些文件上的安全设置,就有可能会意外更改其他文件上的设置。 与解决文件名使用保留名称的方法类似,可以使用一种适当的内部语法删除此文件。例如要删除包含尾随空格的文件,可以使用如下命令: Del \\?\ c:\文件路径\(尾随空格的文件名) 6、文件路径太深无法访问 文件位于比最大路径字符数(MAX_PATH)更深的路径中,可能导致文件无法访问,当然,这种情况较为少见。如果路径深的原因是文件夹名称太长,最简便的解决方案是使用自动生成的8.3名称访问该文件。如果8.3路径也太长,可以从根文件夹开始重命名文件夹,缩短它们的名称,以使目标文件的路径深度不超过MAX_PATH。若是文件的深度超过128个文件夹,可以通过创建一个网络共享,使其位于文件夹树中尽可能深的位置,然后通过访问此共享来访问文件。 一般情况下,如果遇到因文件路径太深无法访问的情况,可以通过使用创建文件的软件来管理这些文件。也就是说,如果有一个程序,它可以创建超过MAX_PATH的文件,则我们也可以使用该程序来管理这些文件。此外,对于通过网络共享创建的深层次结构的文件也可以通过使用同一共享来进行删除。 前面介绍了Windows系统中文件或文件夹无法删除的几种原因以及解决的方法。在某些情况下,可能还会遇到上述各种原因的不同组合,使得删除文件的过程更加复杂。这就需要读者能够举一反三,灵活应用微软提供的各种实用工具进行解决了。 7、Windows XP中删除AVI文件的问题 很多朋友可能会遇到Windows XP中无法删除AVI文件的问题,这主要是由于Windows XP视频预览功能的Bug所导致的。你可以尝试用以下方法进行删除。 方法一:在运行命令框中输入“Regs-vr32/u Shmedia.dll”并回车,卸去Windows XP的视频文件预览功能。当以后想要恢复视频预览功能时,再使用“Regsvr32Shmedia.dll”命令重新注册即可。 方法二:先打开命令提示符窗口,然后在任务管理器中结束Explorer进程,再从命令提示符窗口中切换到保存视频文件的文件夹下,用Del命令删除文件。 方法三:如果安装了双系统,可以从另一个系统,如Win98下进行删除。 8、病毒所致 呵呵,当然需要尽快清毒! 9、文件分配表有问题 简单解决方法: 点击"开始"菜单 输入"CMD",会弹出DOS命令窗口, 输入"CHKDSK D:/F"(如果你的文件在E盘则把D改成E) 会提示你是否卸下D盘,输入“Y”,即可扫描磁盘错误并修复。 注意:在内部,NTFS 将文件夹看作是特殊类型的文件。因此,本文中的“文件”一词可能指文件,也可能指文件夹。 但是以上解决方法很多时候并不能解决问题,还需要从细节方面来分析和解决: 1、文件使用了访问控制列表 如果某个文件使用了访问控制列表 (ACL),您可能无法删除该文件。要解决此问题,请更改该文件上的权限。您可能需要拥有这些文件的所有权才能更改权限。 管理员具有取得任何文件所有权的隐含能力,即使未明确向他们授予针对此文件的任何权限也是如此。文件所有者具有修改文件权限的隐含能力,即使未明确向他们授予针对此文件的任何权限也是如此。因此,您可能需要取得对某个文件的所有权,赋予自己删除文件的权限,然后才能删除文件。 因为文件使用了不规范的 ACL 而不能使用某些安全工具显示或修改其权限。 要解决此问题,请使用另一种工具(例如:Cacls.exe 的更新版本)。 根据所属类型,ACL中的访问控制项(ACE)有特定的优先顺序。例如,拒绝访问的ACE一般位于授予访问权的 ACE 之前。不过,我们无法防止某个程序编写按任意顺序安排 ACE 的 ACL。在 Windows 的一些早期版本中,当 Windows 尝试读取这些“不规范”的 ACL 时会出现问题。在某些情况下,无法通过使用 Windows 资源管理器图形化安全性编辑器正确修改这些 ACL。此问题在 Windows 的更高版本中得到了纠正。如果您遇到了此问题,请使用最新版本的 Cacls.exe。即使无法显示或编辑一个现有的 ACL,您也可以编写一个允许您访问该文件的新 ACL。 2、文件正在使用中 如果文件正在使用中,则可能无法删除该文件。要解决此问题,请确定具有打开句柄的进程,然后关闭此进程。 根据文件打开的方式(例如以独占访问而不是共享访问方式打开),您可能无法删除使用中的文件。任何时候,您都可以使用多种工具来帮助确定拥有文件打开句柄的进程。 此问题的“症状”可能多种多样。您可能能够使用删除命令删除一个文件,但在打开该文件的进程释放该文件之前,该文件实际上并未删除。另外,您可能无法访问正在删除中的文件的安全对话框。要解决此问题,请确定具有打开句柄的进程,然后关闭此进程。 3、文件系统损坏使您无法访问此文件 如果文件系统被破坏,则可能无法删除此文件。要解决此问题,请在磁盘卷上运行 Chkdsk 实用工具以纠正任何存在的错误。 磁盘上的坏区、其他硬件故障或者软件错误都可能会损坏文件系统,使文件出现问题。典型操作失败的方式可能各不相同。当文件系统检测到有损坏时,它将在事件日志中记录一个事件,而且您通常会收到一条提示您运行 Chkdsk 的信息。根据损坏的性质,Chkdsk 可能能够也可能无法恢复文件数据;不过,Chkdsk 可以使文件系统返回到一种在内部一致的状态。 4、文件位于比最大路径 (MAX_PATH) 字符数更深的路径中 如果文件路径有问题,您可能无法打开文件。 解决方案1:使用自动生成的 8.3 名称访问该文件 要解决此问题,您可能需要使用自动生成的 8.3 名称访问该文件。如果路径深的原因是文件夹名称太长,则这可能是最简便的解决方案。如果 8.3 路径也太长,或者如果 8.3 名称已在该卷上被禁用,则请转到解决方案 2。 解决方案2:重命名或移动路径深的文件夹 要解决此问题,请重命名文件夹,以使目标文件的路径深度不超过 MAX_PATH。如要这样做,请从根文件夹(或任何其他方便的位置)开始,然后重命名文件夹,缩短它们的名称。如果此步骤不能解决此问题(例如,如果文件的深度超过 128 个文件夹),请转到解决方案。 解决方案3:使用一个与文件夹具有相同深度的网络共享 如果解决方案1 或解决方案 2 不太方便,或者不能解决问题,请创建一个网络共享,使其位于文件夹树中尽可能深的位置,然后通过访问此共享来重命名文件夹。 解决方案4:使用能够遍历深路径的工具 许多 Windows 程序都假定最大路径长度少于 255 个字符;因此,这些程序只分配了足够容纳这些典型路径的内部存储。而 NTFS 则没有这一限制,它可以容纳更长的路径。 如果您在文件夹结构中一个已经相当深的位置创建一个共享,然后通过使用此共享在此位置之下创建一个深层结构,则可能会遇到此问题。某些在文件夹树上进行本地操作的工具可能无法遍历从根文件夹开始的整个文件夹树。您可能需要以特殊方式使用这些工具,以便它们能够遍历该共享位置。(CreateFile API 文档说明了一种在此情形下遍历整个文件夹树的方法。) 一般情况下,您可以通过使用创建文件的软件来管理这些文件。如果有一个程序,它可以创建超过 MAX_PATH 的文件,则一般情况下您可以使用此同一程序来删除或管理这些文件。您通常可以通过使用共享来删除在此同一共享上创建的文件。 5、文件名包括 Win32 命名空间中的一个保留名称 如果文件名中包括 Win32 命名空间中的一个保留名称(例如“lpt1”),则可能无法删除此文件。要解决此问题,请使用非 Win32 程序重命名该文件。您可以使用 POSIX 工具或任何其他使用适当内部语法的工具来使用此文件。 另外,如果您使用特定的语法指定到该文件的路径,则可能能够使用一些内置的命令绕过典型的 Win32 保留名称检查。例如,如果在 Windows XP 中使用 del 命令,则在使用以下特殊语法指定到该文件的完整路径的情况下,可以删除名为“lpt1”的文件: del \\?\c:\文件路径\lpt1 如果使用典型的 Win32 CreateFile 机制打开到某个文件的句柄,则某些文件名称是为旧式 DOS 设备保留的。为了向后兼容,不允许使用这些文件名,也不能使用典型的 Win32 文件调用来创建它们。不过,此问题并不是 NTFS 的一种限制。 通过使用遍历超过 MAX_PATH 的文件夹时所用的那种技巧,您可能能够使用 Win32 程序绕过在创建(或删除)文件时执行的典型名称检查。另外,有些 POSIX 工具不需接受这些名称检查。 6、文件名包括 Win32 命名空间中的无效名称 如果文件名中包括一个无效名称,您可能无法删除该文件(例如,文件名有一个尾随空格,或一个尾随句点,或者文件名仅由一个空格组成)。要解决此问题,请用一种使用适当内部语法的工具删除此文件。您可以将“\\?\”语法用于某些工具,以便对这些文件进行操作,例如: del "\\?\c:\包含尾随空格文件的路径.txt " 导致此问题的原因与原因 5 类似。然而,如果使用典型的 Win32 语法打开名称中有尾随空格或尾随句点的文件,则尾随空格或句点在打开实际文件之前会被去掉。因此,如果在同一个文件夹中有两个分别名为“AFile.txt”和“AFile.txt ”的文件(注意文件名后面的空格),如果您尝试使用标准 Win32 调用打开第二个文件,实际上会打开第一个文件。同样,如果文件的名称仅是“ ”(一个空格字符),当尝试使用标准 Win32 调用打开它时,实际上会打开该文件的父文件夹。在此情况下,如果您尝试更改这些文件上的安全设置,您可能要么做不到,要么会意外更改其他文件上的设置。如果发生此行为,您可能会认为您对一个实际上具有限制性 ACL 的文件拥有操作权限。 多种原因 在某些情况下,您可能会遇到上述各种原因的不同组合,这会使删除文件的过程更复杂。例如,如果您作为计算机管理员登录,可能会同时遇到原因 1(您无权删除文件)和原因 6(文件名包含一个尾随字符,导致文件访问重定向到其他文件或者不存在的文件),您可能无法删除该文件。如果您尝试通过取得文件的所有权和添加权限来解决原因 1 的问题,可能仍然无法删除该文件,因为用户界面中的 ACL 编辑器由于原因 6 而无法访问到正确的文件。 在此情形中,您可以使用 Subinacl 实用工具和 /onlyfile 开关(此实用工具包括在资源工具包中)来更改文件的所有权和操作权限(若不更改则无法访问),例如: subinacl /onlyfile "\\?\c:\有问题文件的路径" /setowner=域\管理员 /grant=域\管理员=F 注意:此命令要在一行中输入;为便于阅读已换行。 此示例命令行修改了包含尾随空格的 C:\有问题文件的路径文件