Windows似乎在尝试删除文件时对文件名有长度限制,尽管它不会阻止创建这些文件。

我们的构建过程会创建许多临时文件(许多WSDL)。我们的ant脚本可以在进行清理时以某种方式删除它们,但是有时我需要删除workarea目录(所有临时文件所在的目录),而实际上并未从ant进行完全清理。这个问题也有同样的错误,但是由于我正在处理目录而不是文件,因此那里的答案对我而言实际上不起作用,而且我并不总是知道导致问题的具体文件或子目录是什么。而且,我尝试避免进行任何手动操作(除了触发单个命令以外)来真正删除它们。 >
Cannot delete [file name]: The file name you specified is not valid or too long.  
Specify a different file name


在powershell中尝试Remove-Item会出现以下错误:错误而不必手动查找问题文件并移动/重命名它们?

评论

我在发布此问题之前找到了解决方案,但是由于其他人可能会遇到此问题,因此我决定发布它,以便他们可以找到我遇到的解决方案。

哦,我知道,但是通常当我做这样的事情时,我会暂时搁置“未回答”问题,看看是否还有其他人有更好的解决方案。

到目前为止,最简单的解决方案:youtube.com/watch?v=qQTyTprFAOg

使用Ubuntu或任何其他Linux可启动CD,我们可以将计算机临时启动到Ubuntu或任何其他操作系统,然后我们可以选择该文件夹并轻松删除它。

这个老问题也有一些有趣的答案:superuser.com/questions/45697/…

#1 楼

使用7-Zip文件管理器删除它们。

如果仍然遇到问题,请确保在7-Zip文件管理器中使用Shift + Delete。否则,Windows尝试将它们移到回收站(这将再次失败)。

评论


谢谢-这摆脱了一个dir树,该树有点递归并且太深,无法删除del / rmdir / rm / explorer

–马丁·贝克特(Martin Beckett)
2010年8月24日15:47

使用shift + Del效果很好-7zip无法将长路径文件发送到回收站...。

–科里
2011-3-2在3:44

+1 7zip。您必须导航到该文件夹​​,然后像@cori一样使用shift + Del。如果从上下文菜单中选择“删除”选项,它将在此失败。 Shift + Del吧!

– Urda
2012年6月20日在21:25

7zip不适用于win7 64,所以linux可以。

–埃里克·弗里森(Erik Friesen)
2014年5月15日在20:09

我赞成,因为使用7zip可以删除还删除其中包含长嵌套文件夹的文件夹。我的node_module文件夹出现问题,其中包含大量的嵌套文件夹,但我无法将其删除。从基础文件夹中完美无缺地修复了7zip。 +1

– Gruber
2014年10月13日23:33

#2 楼

这里没有其他(免费)答案对我有用,但是我在另一个站点上找到了一个答案:

rimraf <dir>


rimraf是一个Node.js程序包,因此您将需要安装包含npm的Node.js。然后,您可以运行:

npm install -g rimraf


然后您可以从命令行运行rimraf

我发现了此解决方案,因为npm本身是造成此问题的原因问题是由于它嵌套依赖项的方式引起的。

rimraf从UNIX命令rm -rf中获取名称,该命令递归删除文件和文件夹。

评论


尝试了很多方法。这只是完美的工作!

–鸭蛋
2015年11月17日下午13:14



最好的答案:)是的,很容易

– Al-Muthafar
2015年12月8日,12:47

这应该是公认的答案。

– NINCOMPOOP
16 Mar 10 '16 at 6:44

您的解决方案有效,但是实在太麻烦了,以至于我必须使用节点js模块删除节点js模块文件夹...我不想再生活在这个星球上

–Benoit P
16-09-23在10:04

Node首先为我创造了这个问题,所以……有趣的……他们也有解决方案。

– Eric J.
16-9-27在16:43

#3 楼

无需安装任何程序即可解决此问题。

使用robocopy可以轻松解决此问题,该问题自2006年推出Windows Vista以来就已预装。无需使用7zip或任何其他第三方工具。 Powershell是一个过大的杀伤力。 Cygwin可能可以工作,但是您可能未安装它。因此,我们将重点放在rmdir /S /Q <dir>

,这个想法是


使用robocopy从新的空文件夹
复制并更新


执行robocopy后,目标目录也将为空。

这些说明适用于命令行。只需在Windows中打开搜索,键入robocopy并按Enter。

我们要删除的目标是: :



首先创建一个空目录,fi cmd

C:\delete\this folder\with a very long name



使用选项C:\emptyfolder

mkdir C:\emptyfolder



删除空目录。您不再需要它。

robocopy c:\emptyfolder "C:\delete\this folder\with a very long name" /purge



由于源目录(/purge)中没有文件或文件夹,它只是删除文件并最终目标目录(C:\emptyfolder)下的文件夹
/>通过将文件夹从资源管理器窗口拖放到Terminal / cmd窗口中。


注意:删除的文件不会进入回收站文件夹!一旦删除,文件将无法恢复。

(来自BVLANGEN的“路径太长?使用Robocopy”)

PS:我意识到这个答案在这里,而没有那么讲究。如何在Windows中删除文件名过长的文件? [重复]

添加的特性:


您可能需要多次执行此过程才能删除所有文件。


评论


谢谢你,先生!这应该是一个可以接受的答案,因为所有其他答案都不起作用或需要第三方工具。 :)

– MickyD
16 Dec 23'0:44

这很完美...不需要安装任何东西(据我所知),而且速度很快。这应该是公认的答案!

–苦参碱
17年1月6日在17:01

这样会将部分(或全部)目录树保留在“ c:\ deletefolder”(目标目录)下。无论如何,我一瞬间删除了所有内容(猜测文件很小),而我只需要手动“ c:\ deletefolder”,即可删除子目录。像魅力一样工作。 +1,应该是公认的答案! :)

–rld。
17年1月15日13:45



处理高度递归的目录时,此选项比7zip慢得多。等待20分钟后,我对它们进行了基准测试并实现了7zip,尽管并没有显示进度快了50倍。

–安迪·格格(Andy Gauge)
18年8月22日在22:25

我同意@MickyD:这应该在顶部,作为公认的答案!我现在通常使用我的“指定的空目录”:robocopy C:\ Users \ \ empty \ purge> nul虽然我喜欢在同步目录时进行robocopy诊断,但我还是希望以静默方式删除内容...

– Flandraco
2月28日17:55

#4 楼

我相信我已经找到一种从cmd删除内容的方法。最初,我尝试使用del命令,但这没有用。然后我想起了rmdir。请执行以下操作:

rmdir /S /Q <dir>


似乎奏效了。

评论


没为我工作。 :(

–安德鲁·阿诺特(Andrew Arnott)
2010-12-26 1:20

在尝试运行rmdir之前,请记住先放入cmd。

–brianpeiris
2012年7月13日在13:16

对于无法使用此解决方案的用户,我有一个对我有用的替代解决方案(路径/文件名太长):将文件/目录移动到C:\以缩短路径,然后从那里删除。

– Anders SandbergNordbø
2013年9月16日上午10:38

7-Zip可能会删除该解决方案无法使用的目录。我只是发生在我身上。

– SamStephens
13年12月18日在16:07

此解决方案获得不一致的结果。拜托,不要投票。

–教父
16-09-13在0:09

#5 楼

遇到此问题时,我使用的工具是FastCopy。我从下拉菜单中选择了全部删除,选择了要删除的目录,然后单击全部删除。



FastCopy是可移植的(不需要安装),有32位和64位版本。

评论


如果您正在寻找命令行工具,则可以使用我在GitHub(github.com/epsitec/Tools-RecursiveDelete)上发布的一个小工具。

–皮埃尔·阿尔诺(Pierre Arnaud)
2015年3月27日在6:10

我有一组递归生成的嵌套文件/文件夹。这是唯一可行的解​​决方案

–皮尔路易吉(Pierluigi)
15年11月26日在13:15

当命令行内容失败,7zip尝试失败时,这对我有用。甚至微软的支持也陷入困境!

– Kit Ramos
16 Mar 25 '16 at 4:02

同样在这里-我有点开始使用7zip删除文件,但是它也表现得很奇怪,我不得不连续Shift + Delere连续多次删除每个目录才能真正将其删除,但是后来我尝试了此工具,就像一个魅力一样。启动它两次以清除所有文件。谢谢!

– Artanis
16年5月30日在20:47

谢谢,对我来说,也是唯一可行的解​​决方案,很棒!!!

–蒂姆
16年6月12日在11:27

#6 楼

无需安装其他软件,您可以使用subst命令临时为长命名目录创建别名。

例如如果要删除文件夹C:\Very long directory\that exceed\length limit\blah blah blah\abcde\folder to be deleted,可以使用命令

subst x: "C:\Very long directory\that exceed\length limit\blah blah blah\abcde"


,然后可以在Windows资源管理器或命令提示符下轻松删除X:\folder to be deleted。要删除临时驱动器号别名,请使用命令

subst x: /d


评论


我尝试了所有其他答案(包括其他类似问题的答案),这是唯一为我工作的答案。它是迄今为止最快的。

– Glenneroo
17年5月26日在12:54

到目前为止,这是最好的答案:简单的内置功能,不会使注册表混乱。应该是公认的答案。

–凯文·罗氏(Kevin Roche)
17年9月12日在15:01

最简单,最简单的方法,谢谢肯尼斯。

–赛斯
18年6月13日在16:25

嗯,这个答案吓到我了,因为我实际上有一个X:驱动器。这里没有足够的信息,我不建议人们在没有进一步解释的情况下关注此信息。

–qodeninja
19年9月9日在2:31

这种方法有效,但更麻烦的是,如其他答案所述,使用7zip或robocopy实际上更容易。

– davidbak
4月18日下午3:02

#7 楼

Cygwin的rm -rf在很长的路途上都能很好地工作!

评论


Cygwin为我完美地工作了! -rm -rf和所有文件都被删除了。

–Ranhiru Jude Cooray
14-10-23在4:42

在GNU bash版本4.1.10(4)-发行版中也为我工作

–匿名
2015年9月22日4:13在

从Git Bash命令窗口运行时效果很好。我已经为此安装了GitGui。

–user635807
16年8月30日在15:48

#8 楼

只需通过运行以下命令从Powershell进入命令:

Cmd /C "rmdir /S /Q <dir>" 


评论


“目录不为空”。哎呀。 OP希望删除一个非空文件夹。

–leye0
16-4-23在23:19

这和@herms的答案有什么不同?

–bigbadmouse
18/09/11在10:22

#9 楼

Dentrasi的解决方案最适合我,但我想在顶级答案中发布具体步骤。


下载并安装最新的稳定版7zip。
运行7zip文件管理器(7zfm.exe)。
在7zip文件管理器中,进行导航,以便可以看到要删除的文件夹的名称(例如,您位于父文件夹中)。
按住Shift键。
在键盘上或7zip文件管理器工具栏中单击“删除”按钮;确保您仍然按住Shift键。
单击“确定”按钮;确保您仍然按住Shift键。


评论


不错的尝试,但对于递归文件夹的10的k仍然对我不起作用。只有rimraf有效。

–朱利安·奈特(Julian Knight)
2015年9月11日下午16:40

@JulianKnight:是的,这种方法也没有100%地对我有用。我只想提及它,因为它是更简单的过程之一,并且至少在部分时间内有效。我发现,唯一有效的方法是100%的时间是Powershell + NTFSSecurity模块脚本方法,下面将对此进行介绍。 IIRC rimraf在被调用时失败了,这就是我一开始就陷入困境的方式。有关详细信息,请参见此Node.js线程:github.com/nodejs/node-v0.x-archive/issues/…

–质点网
2015年9月14日下午5:38



是的,总会有这样的问题。实际上,是我在(Java)中使用了Arduino IDE的库安装代码,我无意中选择了包含库的文件夹作为文件夹来安装一个库。我一意识到我就终止了该过程,但是已经有了10个文件夹(千个i7 / SSD!)。NPM的下一个主要发行版旨在帮助解决Node的许多深层库安装问题,因为应该满足依赖关系。更扁平的结构。不过,我还是很高兴有人将我带到rimraf上-轻松又免费。

–朱利安·奈特(Julian Knight)
2015年9月18日在8:22

@JulianKnight-是的,在一两天前有人告诉我,npm3应该通过防止深度嵌套的依赖项文件夹结构来减轻这些问题。

–质点网
15年9月27日在21:38

不知道它是否可以“预防”,但确实可以更明智地处理嵌套的依赖项,因此,如果您的主应用程序需要库X v1.0,而库Y需要Z也需要X v1.0,则将使用顶级库。目前,Z将安装自己的X版本。

–朱利安·奈特(Julian Knight)
2015年9月28日14:00

#10 楼

现有答案中还没有提到两件事。


您可以使用扩展长度路径前缀来访问长路径
对于Windows 10,您可以启用以下功能的长路径支持一般用途-但是请注意,并非所有应用程序都可以使用长路径运行,因此应测试较旧的软件。只有带有适当清单条目的软件才能使用此功能。

长路径前缀

Windows API具有特殊功能,支持最大32k的Unicode路径名字符长(每个元素的长度最多为255个字符)。

这通常被误称为UNC命名,但与之无关。

用来告诉API使用长Unicode路径的前缀是\?\,如下所示:

\?\D:\very long path


当引用形式为\servername\path name\file name的远程服务器上的路径时,通常使用UNC名称。您可以将其与长路径前缀结合使用,以便:\?\UNC\server\share

请注意,某些应用程序虽然写得不好,但很不幸的很常见,它们不支持UNC文件路径,也不支持长路径前缀。

参考:https://msdn.microsoft.com/zh-CN/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath

长路径支持

此选项已添加到Windows 10的最新版本中。在编写本文时,默认情况下未激活此选项,因为它需要特定的应用程序支持。有趣的是,PowerShell具有内置的支持,因此启用此选项将允许长路径直接在PowerShell脚本中使用。

如果具有Windows版本,则可以通过组策略编辑器将其激活。或者,您可以简单地使用以下注册表更改。与往常一样,请先备份要更改的注册表部分,然后再执行任何操作。


运行regedit.exe
确认UAC提示符。
导航到键:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48981759-12F2-42A6-A048-028B3973495F}Machine\System\CurrentControlSet\Policies

创建或更改密钥LongPathsEnabled
如果不存在,请右键单击“策略”,然后从菜单中选择“新建”>“ Dword(32位)值”。
LongPathsEnabled设置为1以启用。

任何具有适当清单的应用程序条目现在将可以访问POSIX标准长路径。这应该包括Windows Store应用。

参考:https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths -on-windows-10 /

更新2017-04-09

@maoizm指出了上面的注册表项存在的问题,因此我做了一些更深入的研究。看来您现在可以使用系统密钥设置长文件名支持:

HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)


这仍然仅适用于专门设置为使用文件名的应用程序(需要输入在应用程序的manifest.xml中)。

您还应注意,此方法不能使用相对路径名。

评论


{48981759-12F2-42A6-A048-028B3973495F}注册表路径的机器部分在每台计算机上都将有所不同-可能对每个人来说都不是很明显

– maoizm
17年4月5日13:00



@maoizm-好的,谢谢您强调这一点。如果使用W10周年更新或更高版本,请查看我的更新以作为替代。

–朱利安·奈特(Julian Knight)
17年4月9日在13:44

我正在编写一个名为FoundationIO的库,并且试图将长路径设置为默认值,是否可以设置任何函数或宏,以使我的库中的任何用户自动启用长路径支持?

– MarcusJ
18年4月4日在2:49

嗨,马库斯,这是本地Windows库吗?如果是这样,.NET具有作为相关Windows API一部分已提供的所需支持-抱歉,我不是.NET或Win API程序员,所以我不知道详细信息,但可以在MSDN上搜索这些详细信息。

–朱利安·奈特(Julian Knight)
18年6月8日在12:23

#11 楼

我喜欢cmd解决方案。尽管我想分享甚至仅在Explorer中也可以使用的另一种解决方法:尝试在删除之前缩短父文件夹的名称:较短的名称将缩短路径。说,您具有文件夹的树结构:

C:\

..项目

.. ..春季一些很棒的项目2014

.. .. .. ..在城市公园里的某个星期五活动

...... Bla bla bla bla bla bla bla bla bla bla bla bla bla

..........实际文件名也很长

在这种情况下,您无法删除文件夹,也无法删除或重命名文件都没有。如果要删除整个文件夹结构或其中的一部分,可以临时重命名父文件夹并缩短路径,然后删除该文件夹。名称可以只是字母:

C:\

..项目

.. .. x

.. .. .. y

.. .. .. z

.. .. .. ...也有长名称的实际文件

就我而言,我只想删除包含许多子文件夹和文件的整个文件夹。所以我不在乎文件夹的名称。

评论


我编写了一个微型工具来完成此任务,并将其发布到GitHub。 github.com/epsitec/Tools-RecursiveDelete

–皮埃尔·阿尔诺(Pierre Arnaud)
2015年3月27日6:07



所有命令或Shift + DEL都不对我有用,但是可以。

–larkee
15年7月21日在12:35

当您有10个k的嵌套文件夹时,这实际上不起作用

–朱利安·奈特(Julian Knight)
2015年9月11日下午16:39

如果其中一个文件夹的名称很长(您也不能重命名有问题的文件夹),也无法使用。

–野牛
17年11月21日在12:06

#12 楼

7-zip解决方案效果很好。如果已安装git,则另一个选择是打开bash外壳并使用:

rm -f

(或rm -rf用于文件夹)

评论


对于初学者,请解释一下您如何在Windows中“打开bash外壳”?

– O.M.Y.
16-6-25在11:30



@ O.M.Y。您需要安装git。然后从开始菜单中可以打开git bash,或者如果在安装git时选择了扩展程序,则可以右键单击文件夹或在该文件夹上选择Git Bash。

–用户
16 Jun 25'11:36



#13 楼

我建议使用Total Commander(共享软件,但试用期过后仍可以使用最小的nag启动屏幕进行操作)。
这就是我始终解决文件名过长问题的方法。

评论


感谢主我发现了这一点。删除node_modules文件夹时遇到问题,因为它决定愚蠢地嵌套目录。

–别名
14年8月14日在9:27

好吧,@ Alias,Total Commander使该问题更容易发现,至少对我而言。识别出此类问题后,chkdsk应该解决它。

– Sopalajo de Arrierez
14年8月14日在9:59

7.0版不起作用,它显示一条错误消息,并建议以管理员身份进行操作,该操作也会失败。

–izogfif
16年1月21日在15:36



@izogfif:今天的最新版本是8.52a。我会尝试这个。您没有提供有关错误消息的详细信息,但是可能在存档结构上存在一些不一致之处,必须使用“ chkdsk c:/ f”(假设驱动器C :)来解决(至少对于NTFS)。

– Sopalajo de Arrierez
16年1月22日,0:27

#14 楼

您也可以使用其等效的短名称删除它们。 dir /x将向您显示。

#15 楼

我创建了一个简单的Java程序,该程序使用robocopy删除文件。该罐子是可运行的。如需其他输出,请从cmd行运行。

https://drive.google.com/file/d/0B5pSEjxJvt_1WVp1T3puSm1CNjg/view?usp=sharing

评论


如果您不想使用Java,则可以使用我使用.NET(github.com/epsitec/Tools-RecursiveDelete)编写的此工具。

–皮埃尔·阿尔诺(Pierre Arnaud)
15年3月27日在6:09

@PierreArnaud非常有用。我需要类似这样的命令来实现命令行自动化。 @CamHart你也很出色!多谢你们!

– amitthk
17年1月20日在4:30

#16 楼

我已经尝试了所有其他答案,但是它们没有用(对我来说至少)。



我遇到了delinfile,并且运行得很好而且非常快!

它的试用期仅限于3次操作/ 15天,但可以使用如果您只想删除一些文件夹/文件:



#17 楼





下载
使用带有RemoveDirectoryW的递归调用删除现有目录
使用自己的文件存储库对于新创建的目录
可以在删除包含目录之前将文件从目录中移出。
速度很快,尽管导航到目录顶部是单击每个嵌套目录
Windows XP(SP3)和up
没有安装程序的未签名非托管代码,因此从备用文件夹运行时可能出现智能屏幕警告,例如桌面。

CodeProject上的更多信息。

评论


请阅读“我如何推荐软件”以获取有关如何推荐软件的一些提示。您应该至少提供一个链接,有关该软件本身的一些其他信息,以及如何使用它来解决问题。

–DavidPostill♦
17年1月9日,12:38

@David:更好吗?链接非常有用,谢谢。

– Laurie Stearn
17年1月10日在10:35

#18 楼

我在Windows 10中遇到了这个问题,找到了一个简单的解决方案。


深入文件夹树的深处。
从树的中间拖放一个文件夹使用地址栏移动到树的开始位置。
在我的图像中,将红色框拖放到绿色框。 (在这种情况下,路径较短,但对于较长的路径也可以使用)。
然后,路径变短,并使用Delete键正常删除。



#19 楼

在这里得到了完美的答案(对于文件)。在Windows 10中可以使用。

REM Make sure there is no \ at the end of either path!
robocopy "C:\...\...\...\long\path" "C:\DeleteMe" "FileName" /MOV
REM Note: this ^ can be called many times before...:

REM Finally, recursively delete the higher up DeleteMe directory.
rmdir /S /Q DeleteMe


另请参见:https://msdn.microsoft.com/zh-cn/library/aa365247.aspx#maxpath

4个问题中没有一个单独的答案足以满足我的需求。欢迎世界。

#20 楼

我终于找到了如何通过Powershell做到这一点。这是我在Windows 7上运行时遵循的说明:


在文件夹C:\ Users \ XXXX \ Documents \ WindowsPowerShell \ Modules \ NTFSSecurity中创建一个名为NTFSSecurity的新文件夹,其中XXXX是您的Windows用户名。示例:如果我的用户名是“ aspnyc”,则新文件夹将为C:\ Users \ aspnyc \ Documents \ WindowsPowerShell \ Modules \ NTFSSecurity。
下载文件系统安全PowerShell模块软件包-应该以简单的形式提供ZIP文件。
打开Powershell控制台,运行Get-Module -ListAvailable
,并确保NTFSSecurity出现在已注册模块列表中。
在Powershell控制台中,运行Import-Module。 NTFSSecurity。
在Powershell控制台中,运行Remove-Item2“ YYYY” -Recurse,其中YYYY是您要递归删除的文件夹的Windows路径(例如C:\ Potatoes \ Badgers \ FolderToDelete)。 >

#21 楼

我终于找到了如何在Windows 10上使用Powershell来执行此操作,其中单个文件名过长。以下是我要在Windows 10上运行该文件的步骤:将Zip文件解压缩为目录C:\ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ Modules中的文件夹NTFSSecurity。
使用管理权限(又称为Admin Mode)打开Powershell控制台并运行Get-Module- ListAvailable
,并确保NTFSSecurity出现在已注册模块列表中的某个位置。
运行Set-ExecutionPolicy Unrestricted绕过签名的执行模式。您必须先用Y(es)确认此操作
最终将CD cd到要删除的文件夹。
在Powershell控制台中,运行Import-Module NTFSSecurity。
在Powershell控制台中,运行Remove-Item2“ YYYY” -Recurse,其中YYYY是您要递归删除的文件夹的相对或绝对Windows路径(例如C:\ Potatoes \ Badgers \ FolderToDelete)。
检查是否有效。< br最终使用Set-ExecutionPolicy Restricted设置回签名执行模式。您必须使用Y(es)确认此操作。


#22 楼

如果您在Windows上的Ubuntu上安装了Bash,则可以在常规命令提示符下cd到父目录,然后键入:

bash -c "rm -rf dirname_here"


启动bash,递归地删除linux中没有文件名限制的目录,然后退出并返回常规命令提示符。

#23 楼

导航到WinRAR中的目录,选择文件,按F2键,将文件重命名为较短的名称。然后您可以照常删除文件。

来源:https://www.youtube.com/watch?v=qQTyTprFAOg