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

use*_*186 72 windows filenames

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

dir1\dir1\dir1\dir1\...
Run Code Online (Sandbox Code Playgroud)

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

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

小智 105

如果你像我一样,不喜欢安装其他软件来解决这样的问题,我想一起去XQYZ的建议,并使用robocopy来解决这个问题。(在我的例子中,问题首先是由 robocopy 造成的,通过复制一个包含递归连接点的目录,而不将 /XJ 提供给 robocopy)。

删除从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 摆脱你的中间空目录。

  • 节点包管理器 (NPM) 给我造成了这个问题。出于某种原因,有很多嵌套的包。 (11认同)
  • 我还把“robocopy”和连接点弄得一团糟;感谢您向我展示如何使用它来清理烂摊子! (3认同)
  • 很好的建议。我的问题也是由 robocopy 造成的,正如您所描述的,robocopy 修复程序对我有用。 (2认同)

Syn*_*ech 39

这实际上很容易修复。假设目录结构是这样的:

C:\Dir1\Dir1\Dir1\Dir1…
Run Code Online (Sandbox Code Playgroud)

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

  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
Run Code Online (Sandbox Code Playgroud)

技术说明

其他提议的解决方案是倒退的;您无法通过从最内层目录向外的方式来修复它,您需要朝另一个方向前进。

当您尝试访问目录时,无论是否显式,您都使用其绝对路径,其中包括它之前的所有内容。因此,对于像 那样的目录结构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\
Run Code Online (Sandbox Code Playgroud)

它有 696 个字符长,当然比 260 个字符长得多。 此外,如果您导航到资源管理器中最里面的子目录,当它不在焦点时,它会在地址栏中按预期显示,但是当您单击地址时bar,它将路径更改为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 资源管理器如何处理“太长的路径” 。

  • 创建比 MAX_PATH 长的路径是可能的,[如此处所述](http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx)。不幸的是,`\\?\` 不适用于 `rmdir`。 (3认同)
  • @Synetech:不,它的工作方式不同。像`\\?\C:\dir\dir\dir\dir` 这样的路径实际上*绕过* MAX_PATH; 不涉及“变量”。(但就像我说的,由于某种原因,它不适用于 `rmdir` 或其他 `cmd.exe` 内置程序。) (3认同)
  • (另外,不要将 *path* 长度与 *component* 长度混淆。你不能有一个名称超过 255 个字符的 *single directory*;但是,你可以有一个 *path* 比这更长的时间。) (2认同)

Mat*_*eau 17

您可以通过使用subst来创建虚拟驱动器来缩短路径:

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"
Run Code Online (Sandbox Code Playgroud)

切换到虚拟驱动器:

cd Z:
Run Code Online (Sandbox Code Playgroud)

现在您可以删除文件:

del *.*
Run Code Online (Sandbox Code Playgroud)

删除虚拟驱动器:

cd C:\TEMP
subst Z: /d
Run Code Online (Sandbox Code Playgroud)

删除目录:

rd /s dir1
Run Code Online (Sandbox Code Playgroud)

  • @Synetech,当然,但如果你只替换`C:\TEMP\dir1\dir1\dir1`,那么它会缩短它的一部分,从而让你进入。就像你的重命名建议一样,但是有映射反而。;) (2认同)

小智 10

我写了一个小的 C# 应用程序来帮助我删除一个由粗心使用 Robocopy 和从 Homeserver 备份生成的类似的非常深的结构;默认情况下,Robocopy 将关节点视为常规文件夹...... :-( 你可能会在没有注意到的情况下弄得一团糟。

该工具可在 CodePlex 上获得,带有源文件,供任何人使用。

http://deepremove.codeplex.com


Ric*_*ahl 7

前段时间我创建了一个名为DeleteFiles的小型自包含实用程序可执行文件,您可以使用它轻松执行此任务。

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

deletefiles c:\yourfolder\subfolder\*.* -r -f
Run Code Online (Sandbox Code Playgroud)

删除整个文件夹结构。-r 从起始目录向下递归文件夹层次结构,-f 删除所有空文件夹(如果您使用.作为文件规范,这些文件夹将是所有文件夹)。DeleteFiles 支持比 Windows MAX_PATH 限制更长的路径,因此它可以在深度嵌套的文件夹上正常工作。

DeleteFiles 是免费和开源的,你可以从GitHub获取二进制或源代码,或者直接使用Chocolatey安装


小智 5

现在简单易行

长期以来,我一直面临着同样的问题,因为 node_modules 非常嵌套文件夹。所以最后制作了一个脚本来修复可以通过缩短路径来删除文件夹的问题。

https://github.com/dev-mraj/fdel

npm install fdel -g

fdel ./node_modules
Run Code Online (Sandbox Code Playgroud)


Ƭᴇc*_*007 1

打开命令提示符。

导航到包含最高“dir1”的文件夹/目录(我们假设为 C:\)

c:\> RD /s dir1
Run Code Online (Sandbox Code Playgroud)

编辑 (添加评论后)

其他想法:

MS在这里提供了有关如何处理该问题的信息(有很多想法可以尝试)。

还有这个工具(个人从未使用过) - TooLongPath

也许编写一些内容(因为您有 Eclipse),一路导航,然后一次退出一个文件夹级别,边删除边删除?