Answers:
如果您像我一样,并且不想安装其他软件来解决此类问题,那么我会接受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
摆脱中间的空目录。robocopy
交汇点;感谢您向我展示如何使用它来清理混乱!
实际上,这很容易解决。说目录结构是这样的:
C:\Dir1\Dir1\Dir1\Dir1…
要解决此问题,只需将每个文件夹重命名为一个字符的文件夹名称,直到不再需要太长时间才能删除:
C:\Dir1
为C:\D
C:\D\
C:\D\Dir1
为C:\D\D
C:\D\D\
这是一个用于自动执行该过程的批处理文件(此简单版本最适合问题中所述的简单目录,尤其是一次性目录)。它传递文件夹最大可能的(例如C:\Dir1
为C:\Dir1\Dir1\Dir1…
或C:\Users\Bob\Desktop\New Folder
为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个字符长得多。此外,如果导航到资源管理器中最里面的子目录,则当它不在焦点上但单击地址时,它将按预期在地址栏中显示它条,它将路径更改为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 Explorer如何处理“过长路径” 。
\\?` doesn't work with
rmdir`。
\\?\C:\dir\dir\dir\dir
实际上绕过了 MAX_PATH; 没有涉及“变量”。(但是就像我说的,由于某种原因,它不能与rmdir
其他cmd.exe
内置命令一起使用。)
md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
它将无法工作,因为文件系统具有足够的信息来确定总路径长度为263个字符,因此它失败了。
您可以通过使用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
C:\TEMP\dir1\dir1\dir1
,那么它将缩短其中的一部分,从而使您可以进入。就像您重命名的建议一样,但可以使用映射。;)
:-)
我编写了一个小型C#应用程序,以帮助我删除由于粗心地使用Robocopy和从Homeserver备份而产生的非常深层的结构。默认情况下,Robocopy将关节点视为常规文件夹... :-(您可能会在不注意的情况下陷入混乱。
CodePlex附带源文件可使用该工具,任何人都可以使用。
不久前,我创建了一个小型的,实用的实用程序可执行文件,称为DeleteFiles,您可以使用它轻松地执行此任务。
使用这个独立的实用程序,您可以轻松地执行以下操作:
deletefiles c:\yourfolder\subfolder\*.* -r -f
删除整个文件夹结构。-r从起始目录向下递归文件夹层次结构,-f删除所有空文件夹(如果将。用作文件规范,则全部为空)。DeleteFiles支持的路径长度超过Windows MAX_PATH的限制,因此它在深度嵌套的文件夹上也可以正常工作。
DeleteFiles是免费的开放源代码,您可以从GitHub获取二进制或源代码,也可以直接使用Chocolatey安装
> NUL
到末尾可以使过程更快。
现在简单易用
自从使用非常嵌套文件夹的node_modules以来,我一直面临着同样的问题。因此,最终制作了一个脚本来修复该脚本,该脚本可以通过缩短路径来删除文件夹。
https://github.com/dev-mraj/fdel
npm install fdel -g
fdel ./node_modules
在使用Sikuli时,我在程序中遇到了Calculator.sikuli递归循环,使“ calculator.sikuli.calculator.sikuli”的数量成倍增加。我可以移动树,但是路径名太长而无法删除。
在尝试了几种使用popd循环的解决方案之后,Scandisk却无处可寻。
我编写了此脚本,以“深入”到递归的dirs(在称为“ a”的目录中),将其移动到(称为“ b”的目录中),然后删除被截断的树,将其移回(到“ a”中) ,然后重复:
1)cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
.............go deeeeeep in dir *A*
2) move calculator.sikuli ---> D:\b
.............move the crazy tree to dir *B*
3) kill D:\a\calculator.sikuli <---KILL(rd)
.............wipe dir *A*'s tree
4) move D:\b\calculator.sikuli ---> D:\a\
.............move the crazy tree back to dir *A*
REPEAT
D:
cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
move /-Y calculator.sikuli D:\b
cd D:\b
rd /s/q D:\a\calculator.sikuli
move /-Y calculator.sikuli D:\a
call D:\remdirs2.bat
这只是再次运行批处理文件的调用。
我会尝试打开命令提示符并运行:
rmdir /s <directory>
如果那行不通,我将进入目录树的cd中,尝试删除目录的一个子集(例如20个最里面的目录),然后从那里找出解决方法。
;-)
如果是网络文件夹,则只需共享该目录的父目录并将其映射到本地计算机上的驱动器,然后删除您的文件夹。
打开命令提示符。
导航到包含最高“ dir1”的文件夹/目录(我们假设为C:\)
c:\> RD /s dir1
编辑 (添加注释后):
其他想法:
MS在此处提供有关如何处理问题的信息(可以尝试的许多想法)。
还有一个工具(从未亲自使用过)-TooLongPath。
也许写一些东西(因为有了Eclipse)可以一直导航到整个文件夹,然后一次退出一个文件夹级别,并随即删除?
另一个解决方案:下载Total Commander。这是一个非常有用的程序,不仅因为它知道长文件名。
未注册的版本是nagware,但功能齐全,它将完成工作。
可以直接从命令行或在批处理文件中完成此操作,方法是构建要删除的目录的UNC路径
所以代替
rmdir /s/q c:\mydirectory
采用
rmdir /s/q \\?\c:\myDirectory
这样的UNC样式路径可能更长,并绕过了260个字符的限制。
The path \\?\C:\temp\wqiyretiuqyertiuyqwteiyrutqwuiyertiqrqweirqyert\wqteriuwqyetriuqwteiryutwiuertiuyqerieerrt\IOQWUE~1\QIWUYE~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\ OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1 is too long.
Windows 7 64位。
当我遇到这个问题时,我只是简单地重命名了一些短得多的文件夹名称,然后,如果总路径足够短,它将被删除。无需额外的工具。
ren
命令将以失败path too long
。
我有相同的问题,除了它是由递归Cobian Backup任务创建的。我发现免费的Cobian软件包括一个Deleter应用程序,可以轻松快速地删除这些令人讨厌的嵌套文件夹。
它位于工具菜单下。
我确实遇到了与某些Java应用程序一样的5000+目录深文件夹混乱的问题,并且编写了一个程序来帮助您删除此文件夹。整个源代码在此链接中:
https://gitlab.imanolbarba.net/imanol/DiREKT
一段时间后,它消除了整个问题,但它成功地完成了工作,希望它对像我一样遇到同样令人沮丧的问题的人们有所帮助
您的文件系统可能已损坏。运行chkdsk以查看它是否可以修复任何东西,然后尝试删除该文件夹。
MAX_PATH=255
)长。即使文件系统没有损坏,也可能发生这种情况。