如何删除嵌套很深的文件夹并避免“文件名太长”?

如何删除嵌套很深的文件夹并避免“文件名太长”?

Eclipse 在其中一个嵌套很深的目录中创建了一个临时文件夹,例如

dir1\dir1\dir1\dir1\...

我无法通过资源管理器、delrmdir命令或 Cygwin 的“rm”命令在 Windows 中删除此文件夹。我该如何删除这个很长的文件夹?

它只是一直说“文件名太长……”

答案1

如果你和我一样,不喜欢安装额外的软件来解决这样的问题,我建议你XQYZ的建议并用它robocopy来解决问题。(在我的例子中,问题首先是由 robocopy 引起的,通过复制具有递归连接点的目录而没有向 robocopy 提供 /XJ)。

删除从以下位置开始的目录树c:\subdir\more\offending_dir

整个步骤非常简单:

  1. cd c:\subdir\more使用 cd 进入其父目录。
  2. mkdir empty创建一个空目录。
  3. robocopy empty offending_dir /mir将空目录镜像到有问题的目录中。
  4. 等待一段时间后,您就完成了!使用以下命令完成:
  5. rmdir offending_dir删除现在空的有问题的目录并
  6. rmdir empty摆脱中间的空目录。

答案2

这实际上很容易修复。假设目录结构如下:

C:\Dir1\Dir1\Dir1\Dir1…

要修复此问题,只需将每个文件夹重命名为一个字符的文件夹名称,直到它不再太长而无法删除:

  1. 重命名C:\Dir1C:\D
  2. 导航C:\D\
  3. 重命名C:\D\Dir1C:\D\D
  4. 导航C:\D\D\
  5. 转到 1 直到路径总长度小于 260

这是一个用于自动化该过程的批处理文件(此简单版本最适合问题中描述的简单目录,尤其是一次性目录)。将尽可能高的文件夹传递给它(例如C:\Dir1forC:\Dir1\Dir1\Dir1…C:\Users\Bob\Desktop\New Folderfor 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

答案4

前段时间,我创建了一个小型的、独立的实用程序可执行文件,名为删除文件您可以使用它轻松地完成此任务。

使用这个独立的实用程序,您可以简单地执行以下操作:

deletefiles c:\yourfolder\subfolder\*.* -r -f

删除整个文件夹结构。-r 从起始目录向下递归文件夹层次结构,-f 删除所有空文件夹(如果您使用作为文件规范)。DeleteFiles 支持比 Windows MAX_PATH 限制更长的路径,因此它可以很好地处理深层嵌套的文件夹。

DeleteFiles 是免费且开源的,你可以从GitHub或者直接使用安装巧克力味

相关内容