如何在Windows中删除一个很长的路径。

65

将项目导入Eclipse时,它会以某种方式创建目录的递归版本。

现在,当我尝试删除任何文件时,我会收到“您指定的文件名过长”的提示。

我无法从命令行窗口中删除它。 我无法从资源管理器中删除它。 我无法对它做任何事情。 我不知道Eclipse创建了多少份副本。 在我意识到有问题并取消操作之前,Eclipse运行了大约一分钟。

我可以获取顶级文件夹的属性,并且显示它包含497个文件夹。

问题1:如何在Windows中删除所有这些东西?

问题2:Eclipse到底在想什么?


发起悬赏,希望得到更好/更容易/更快的解决方案。或者,有人可以修复Eclipse,使其能够识别愚蠢的递归复制操作。 - Adam Davis
3
请访问http://technet.microsoft.com/en-us/sysinternals/bb896768,并将一些深层文件夹映射到其他地方。或者在Java中编写一个4行函数并删除它;`static void cleanDir(File dir) { for (File f:dir.listFiles()){ if (f.isDirectory()){ cleanDir(f); } f.delete(); }
}`... 这也提醒了一个Ant任务可以完成相同的工作。
- bestsss
你尝试过从代码中删除它吗? - Alex Reitbort
它可以帮助您删除名称过长的目录中的文件:使用SHIFT + DEL。我曾经有类似的问题,它帮了我一个大忙。 - jellonek
20个回答

171
robocopy empty_dir base_nested_dir /purge

示例:如果您的文件夹路径过长,例如:

D:\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles\BackupFolder\Copy\MyFiles

按照以下说明进行删除。

  1. 创建一个空文件夹,例如C:\ Users \ Name \ Desktop \ temp
  2. 打开命令提示符窗口。
  3. 键入robocopy C:\Users\Name\Desktop\temp D:\BackupFolder /purge

注意:如果步骤3中的任一路径中有空格,则该路径必须用引号括起来。


3
这个方法的好处在于你不需要手动重命名文件或下载额外的工具。只需创建一个空目录,然后告诉robocopy清除目标目录中与空目录不匹配的所有内容。非常方便。 - quillbreaker
我尝试了许多其他方法来删除这些文件:映射网络驱动器,subst,zip。都没有起作用。这个方法有效! - downeyt
这是所有建议中最有效的方法。Robocopy再次拯救了我们...如果您还没有提取文件,7zip方法也可以起作用。它可以在问题出现之前解决烦恼。 - Protonova
我曾经使用robocopy在复制用户目录时创建了一个未经处理的无限循环,把自己搞进了困境...后来想到用robocopy来解决问题,结果成功了。这次我使用了上述推荐的FilExile GUI,效果非常完美。 - rwdsco
6
这应该就是答案。 - Axel
显示剩余3条评论

90

如果您不熟悉命令行,7Zip是最终解决方案。

  1. 打开7Zip文件管理器
  2. 导航到您的文件
  3. Shift-删除您的文件

干杯!


2
我得到了一个目录不为空的错误...就像rimraf一样。 - Oliver
1
请确保您的目录没有在任何窗口中打开,并且该目录中的任何文件都没有被打开。 - Swanidhi
2
这是最简单的解决方案。我喜欢被迫在我的新工作中使用Windows,像这样有趣的事情需要解决。 - Alan Shortis
3
你是个天才。这是最简单的解决方案。 - Rakshith
1
也适用于WinRar、rar和删除操作。 - iss42
显示剩余6条评论

19

我曾经遇到与Eclipse类似的问题:使用Subclipse导入项目时,它生成了一个深层嵌套的目录结构,我无法删除。

我采取了两个步骤,首先我将目录名缩短到尽可能最短的长度(实际上我认为这是无意义的)。其次,我尽可能深地遍历目录树,然后剪切并粘贴分支(这使得删除原始分支成为可能),然后重复此过程。

@Charlie和@Tomalek的解决方案看起来可能更加优雅。不过我没有计划重复这种经历以找出答案。


这可能是最不优雅的,但我尝试了其他方法。花了几分钟,但问题解决了。而且,这正是发生在我身上的事情......我想我当时正在进行导入-> SVN->检出操作。不过,我不会再去尝试重现它来确认。 - Baltimark
很高兴我的经验对你有所帮助 :-) - Ian Hopkinson
1
我不会用它。实际上,我首先要检查是否有5个长达500个字符的文件。最好使用命令行或类似7-Zip文件管理器这样的工具来处理此类问题。 - Swanidhi

12

关于问题1:

使用subst来短路路径:

subst Q: C:\very\long\path\created\by\eclipse
Q:
del *.*

对于第二个问题)

在其他操作系统中长路径不是那么大的问题,而且有Windows API函数可以处理长达255个字符的路径,所以他们只是这样做了,我想。


1
我的目录列表是这样的. . .dirname -> dirname -> dirname -> . . . 大约重复了500次。我可以将“q”重新映射到其中的任何部分,但当我尝试删除“q”时,它会出现相同的问题。 - Baltimark
1
然后继续下一个驱动器字母。看这里:https://dev59.com/iEXRa4cB1Zd3GeqPtJud - Tomalak
好的Tomalak,你的意思是说要不断添加驱动器字母,直到我得到一个可以删除的路径,然后“从底部开始删除”,如果你愿意的话。这个想法与Ian的类似。可能更加高效,节省时间。谢谢。 - Baltimark
@Baltimark:是的,完全正确。如果我遇到这种情况,这种情况偶尔会发生,我通常使用一个小的递归VBScript来处理它,它可以为我处理丑陋的部分并跟踪所有堆叠的驱动器字母。对于一次性的情况,手动操作也足够了。 - Tomalak
2
顺便提一下,使用以下命令删除驱动器:subst Q: /D - Anthony Johnston

11

如果需要处理超过 MAX_PATH 长度的路径,则必须使用Windows文件API的Unicode版本(例如DeleteFileW),并使用 \\?\前缀。您可以编写一个短程序来使用这些API枚举这些目录并将其删除。


注意:如果您使用 \?\,则需要知道挂载卷上的文件系统类型。(例如,您需要知道“/”或“\”是分隔符字符。)WinAPI文档说,对于文件I/O,“\?"前缀路径字符串告诉Windows API禁用所有字符串解析,并将其后面的字符串直接发送到文件系统。(https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx) - Solomon Slow

7
解决方法简单且免费!不需要重新命名文件夹。
  1. 免费下载Cygwin

  2. 使用命令rm -f -r <folder-name>并等待一段时间。

我有一个大小为1.5 GB的文件夹,里面有许多子文件夹,这个方法非常有效!


5
maxaha1的Windows Sysinternals论坛帖子中提到了一个方法。
引用:
建议从上往下进行操作。只要在同一卷(共享)中,通常可以将上级目录拖动到新的父级目录中,而不考虑所拖动的目录内容(即其长度/递归问题)。因此,您可以将位于问题路径下4或5级的一个目录拖到根目录。然后删除现在只包含几个级别的原始路径。理想情况下,保持最长路径小于250个字符(包括文件名)。我正在进行系统迁移,我们有一些用户的路径超过340个字符,如果没有这种方法,它们就无法复制。我已经尝试过subst,递归的net use,递归的脚本等。不幸的是,用户似乎能够创建令最好的编码人员,管理员等困惑的东西。

创建新文件夹并进行拖放,每次向下拖放若干个文件夹(并删除它们),直到全部清除为止。


FileUtils.deleteDirectory("C:\My\Stupid\Path\"); 如果你想使用Apache Commons文件工具并运行一个快速的Java程序。 - Zoidberg
一个有趣的想法,值得官方认可,但与许多其他答案相比,这是非常繁琐和耗时的手动操作。 - Barett

4

我在使用Eclipse时也遇到了同样的问题...!会创建数不清的嵌套文件夹,占用了500多MB的空间!!!

我在Windows中尝试了很多方法都没有效果。

最终我通过重新启动使用Ubuntu并删除那个可怕的文件夹来解决问题。就这样简单。Ubuntu似乎没有像Windows一样基于文件路径长度的访问限制。这让生活变得更加轻松。:)


2
+1 我也想强调一下,对于不熟悉Linux变体的用户来说。像这样简单的任务,并不需要安装Ubuntu的副本来运行它。您可以轻松下载LiveCD版本并从光盘启动操作系统。 - Evan Plaice

4

我编写了这个程序,它确切地使用了这些内容。 - Dawson Goodell
此解决方案仅在您不必更新所有权和/或权限超过260个字符深入嵌套的文件夹和文件时才有用。 - Zarepheth
7Zip文件管理器是免费使用的。使用7Zip文件管理器打开文件并使用Shift+Delete删除您的文件。我的评论是前3个回答中的第一个。 - Swanidhi

3

楼上已经提到了“rimraf”,但让我补充更多细节。如果您的系统上已安装Node,则只需使用rimraf模块(可以将其安装在Path上)即可删除Windows系统中最棘手的东西,这是迄今为止最简单的方法。这并不是因为rimraf很棒,实际上是因为Node.js在设备内核级别处理文件系统。如果您查看Node的“fs”模块源代码,您会看到类似这个的代码。从本质上讲,Node.js比甚至是Git for Windows都更好地处理文件系统,即在Windows上使用git clean -fdx存在漏洞,无法删除具有长路径名的文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接