Eclipse 在其中一个嵌套很深的目录中创建了一个临时文件夹,例如
dir1\dir1\dir1\dir1\...
我无法通过资源管理器、del
或rmdir
命令或 Cygwin 的“rm”命令在 Windows 中删除此文件夹。我该如何删除这个很长的文件夹?
它只是一直说“文件名太长……”
答案1
如果你和我一样,不喜欢安装额外的软件来解决这样的问题,我建议你XQYZ的建议并用它robocopy
来解决问题。(在我的例子中,问题首先是由 robocopy 引起的,通过复制具有递归连接点的目录而没有向 robocopy 提供 /XJ)。
删除从以下位置开始的目录树c:\subdir\more\offending_dir:
整个步骤非常简单:
cd c:\subdir\more
使用 cd 进入其父目录。mkdir empty
创建一个空目录。robocopy empty offending_dir /mir
将空目录镜像到有问题的目录中。- 等待一段时间后,您就完成了!使用以下命令完成:
rmdir offending_dir
删除现在空的有问题的目录并rmdir empty
摆脱中间的空目录。
答案2
这实际上很容易修复。假设目录结构如下:
C:\Dir1\Dir1\Dir1\Dir1…
要修复此问题,只需将每个文件夹重命名为一个字符的文件夹名称,直到它不再太长而无法删除:
- 重命名
C:\Dir1
为C:\D
- 导航
C:\D\
- 重命名
C:\D\Dir1
为C:\D\D
- 导航
C:\D\D\
- 转到 1 直到路径总长度小于 260
这是一个用于自动化该过程的批处理文件(此简单版本最适合问题中描述的简单目录,尤其是一次性目录)。将尽可能高的文件夹传递给它(例如C:\Dir1
forC:\Dir1\Dir1\Dir1…
或C:\Users\Bob\Desktop\New Folder
for C:\Users\Bob\Desktop\New Folder\abcdefghi…
)
@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _
%0
popd
技术说明
其他提出的解决方案是倒退的;您无法通过从最内层的目录向外的方式来修复它,您需要朝另一个方向去。
当您尝试访问目录时,无论是否明确,您都会使用其绝对路径进行访问,该绝对路径包括其之前的所有内容。因此,对于像这样的目录结构C:\Dir1\Dir1\Dir1\Dir1
,最内层路径的长度Dir1
为 22。但是最外层路径的长度Dir1
只有 7,因此无论其内容如何,仍然可以访问(在给定目录路径的上下文中,文件系统不知道它包含什么内容,也不知道它对其子目录的总路径长度的影响;只有其祖先目录 - 如果总路径长度太长,则无法重命名目录)。
因此,当你遇到路径过长时,你需要做的是尽可能地转到最高级别,将其重命名为一个字符的名称,并在其中的每一级重复此操作。每次这样做时,路径的总长度都会缩短旧名称和新名称之间的差值。
反之亦然。您无法创建大于最大支持长度的路径(在 DOS 和 Windows 上MAX_PATH = 260
)。但是,您可以将目录从最内层向外重命名为更长的名称。结果是绝对路径大于 260 的更深的文件夹将无法访问。(这并不会使它们“隐藏”或安全,因为它们很容易获取,所以不要使用此方法来隐藏文件。)
有趣的旁注
如果您在 Windows 7 资源管理器中创建文件夹,则资源管理器似乎允许您创建子目录,使得总长度超过MAX_PATH
,实际上确实如此,但使用“DOS 8.3 文件名”实际上是作弊。您可以通过创建如下树来看到这一点:
C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\
它的长度为 696 个字符,当然比 260 个字符长得多。此外,如果您导航到 Explorer 中的最内层子目录,当它不在焦点中时,它会按预期在地址栏中显示它,但是当您单击地址栏时,它会将路径更改为C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\
,它只有 102 个字符长。
在 XP 中,它不会这样做,而是坚决拒绝创建比支持的更长的路径。
真正有趣的是找出NtfsDisable8dot3NameCreation
设置该选项后 Windows 7 资源管理器如何处理“太长的路径”。
答案3
subst
您可以使用创建虚拟驱动器来缩短路径:
C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"
切换到虚拟驱动器:
cd Z:
现在您可以删除这些文件:
del *.*
删除虚拟驱动器:
cd C:\TEMP
subst Z: /d
删除目录:
rd /s dir1