如何删除路径/名称太长而无法正常删除的目录


380

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

Remove-Item在powershell中尝试会出现以下错误:

Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
At line:1 char:12
+ Remove-Item  <<<< -force -Recurse <directory>

有谁知道有什么工具或简单的方法来解决此删除错误,而无需手动查找问题文件并移动/重命名它们?


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

哦,我知道,但是通常当我做这样的事情时,我会暂时让问题“未回答”,以查看是否有人有更好的解决方案。
爱马仕(Herms)2009年

远东最简单的办法:youtube.com/watch?v=qQTyTprFAOg
TAW

使用Ubuntu或其他任何方式,Linux Bootable CD我们都可以Ubuntu临时将计算机引导至或任何其他操作系统。然后,我们可以选择该文件夹,然后将其轻松删除。
Kelum Priyadarshane 2015年

1
这个较早的问题也有一些有趣的答案:superuser.com/questions/45697/…–
AdamV

Answers:


421

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

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


5
谢谢-这摆脱了一个目录树,它有点递归并且太深,无法删除del / rmdir / rm / explorer
Martin Beckett 2010年

63
工作使用Shift +德尔伟大- 7zip的不能长径处理文件发送到回收站....
科里

66
+1 7zip。您必须导航到该文件夹​​,然后shift + Del像@cori一样使用。如果Delete从上下文菜单中选择该选项,则它将在那里失败。shift + Del它!
Urda 2012年

8
7zip不适用于win7 64,因此linux可以。
Erik Friesen 2014年

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

310

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

rimraf <dir>

rimraf是一个Node.js的包,所以你需要安装Node.js的,其中包括故宫。然后,您可以运行:

npm install -g rimraf

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

我找到此解决方案是因为npm本身由于嵌套依赖项的方式而导致了此问题。

顺便说一下,rimraf它是从UNIX命令获取名称的,该命令rm -rf递归地删除文件和文件夹。


7
尝试了很多方法。这只是完美的工作!
Duckegg,2015年

2
所有:)是其易于beasy的最佳答案
铝Mothafar

2
这应该是公认的答案。
NINCOMPOOP

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

4
Node首先为我造成了问题,所以……有趣的……他们也有解决方案。
Eric J.

141

无需安装任何程序来解决这个问题。

robocopy自2006年推出Windows Vista以来就预装了此问题,可以轻松解决此问题。

例如,rmdir /S /Q <dir>据报道在某些情况下会失败。无需使用7zip或任何其他第三方工具。Powershell太过分了。Cygwin可以工作,但您可能未安装它。所以,让我们专注于robocopy

这个想法是为了

  1. 用于robocopy复制+更新
  2. 从一个新的空文件夹
  3. 到要删除的文件夹(目标)。

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

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

假设删除目标是:

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

我们进行如下:

  1. 首先创建一个空目录fi C:\emptyfolder

    mkdir C:\emptyfolder
    
  2. 使用选项从空目录复制+更新到目标 /purge

    robocopy c:\emptyfolder "C:\delete\this folder\with a very long name" /purge
    
  3. 删除空目录。您不再需要它。

    rmdir c:\emptyfolder
    

由于源目录(C:\emptyfolder)中没有文件或文件夹,因此只需C:\delete\this folder\with a very long name递归删除目标目录()下的文件和文件夹!

  • 最后一招:您可以避免手写

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

    通过从“资源管理器”窗口中拖动文件夹并拖放到“终端/ cmd”窗口中。

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

(摘自BVLANGEN的“路径过长?使用Robocopy”

PS:我知道这个答案就在这里,少了一些教学上的问题。如何在Windows中删除文件名过长的文件?[重复]

Benoit添加了:

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


11
谢谢你,先生!这应该是可以接受的答案,因为其他所有的都不工作或需要第三者工具。:)
MickyD '16

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

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

@rld,但是之前是否存在“删除文件夹”?否则,如果它是新目录,我认为它应该为空。否则就是一团糟。我可以为“ rmdir deletefolder”添加最后一步。
hectorpal '17

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

84

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

rmdir /S /Q <dir>

似乎有效。


105
没为我工作。:(
安德鲁Arnott 2010年

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

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

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

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

29

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

FastCopy删除对话框屏幕截图

FastCopy是便携式的(无需安装),并且有32位和64位版本。


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

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

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

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

谢谢,对我来说,也是唯一可行的解​​决方案,棒极了!!!!
蒂姆(Tim)2013年

26

无需安装其他软件,就可以使用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"

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

subst x: /d

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

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

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

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

25

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


3
Cygwin为我完美地工作了!-rm -rf和所有文件都被删除了。
Ranhiru Jude Cooray 2014年

3
在GNU bash版本4.1.10(4)
发行

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


18

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

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

不错的尝试,但对于递归文件夹的10的k仍然对我不起作用。只有rimraf有效。
朱利安·奈特2015年

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

是的,总会有这样的问题。实际上,这是我在(Java)中使用Arduino IDE的库安装代码完成的,我无意中选择了包含库的文件夹作为文件夹来安装一个库。我一意识到我就杀死了该过程,但是已经有了10个文件夹,其中k个文件夹(该死的i7 / SSD!)NPM的下一个主要发行版旨在帮助解决Node的许多深层库安装问题,因为应该满足依赖关系。更扁平的结构。不过,我仍然很高兴有人将我介绍给rimraf-简单,免费。
朱利安·奈特

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

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

11

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

  1. 您可以使用扩展长度路径前缀来访问长路径
  2. 在Windows 10中,您可以启用长路径支持常规用途-但是请注意,并非所有应用程序都可以在长路径上运行,因此应测试较旧的软件。只有带有相应清单条目的软件才能使用此功能。

长路径前缀

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

这通常被错误地称为UNC命名,但是尽管没有关系。

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

\\?\D:\very long path

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

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

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

长途支持

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

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

  1. 运行regedit.exe
  2. 确认UAC提示。
  3. 导航至键: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48981759-12F2-42A6-A048-028B3973495F}Machine\System\CurrentControlSet\Policies
  4. 创建或更改密钥LongPathsEnabled
  5. 如果不存在,请右键单击“策略”,然后从菜单中选择“新建”>“ Dword(32位)值”。
  6. 设置LongPathsEnabled1启用。

现在,具有适当清单条目的所有应用程序都可以访问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}Machine注册表路径的一部分在每台计算机上都将有所不同-可能对每个人来说都不明显
maoizm 2015年

1
@maoizm-好的,谢谢你强调了这一点。如果使用W10周年更新或更高版本,请查看我的更新以作为替代。
朱利安·奈特

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

嗨,马库斯,这是本地Windows库吗?如果是这样,.NET具有相关Windows API中已经存在的必需支持-抱歉,我不是.NET或Win API程序员,所以我不知道详细信息,但是详细信息应该可以在MSDN上搜索。
朱利安·奈特

8

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

C:\

..项目

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

.. .. ..周五在城市公园的一些活动

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

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

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

C:\

..项目

.. .. X

.. ..。y

.. .. .. z

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

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


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

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

当您有10个k的嵌套文件夹时,它实际上不起作用
朱利安·奈特

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

7

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

rm -f

(或rm -rf用于文件夹)


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

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

4

我建议使用Total Commander(共享软件,但在试用期过后仍可使用最小的nag开始屏幕继续工作)。这就是我始终解决文件名太长的问题的方式。


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

好吧,@ Alias,Total Commander使该问题更容易发现,至少对我而言。确定此类问题后,chkdsk应解决它。
Sopalajo de Arrierez,2014年

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

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


2

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

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


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

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

1

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

我遇到了delinfile,工作得很好而且很快!

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


1

更大的目录也是为此任务而设计的。 在此处输入图片说明

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

有关更多信息,请参见CodeProject


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

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

1

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

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

在此处输入图片说明


1

在这里得到了完美的答案(对于文件)。在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个问题中没有一个单独的答案足以满足我的需求。不客气的世界。


0

我终于找到了如何通过Powershell做到这一点。以下是我在Windows 7上执行此操作的说明:

  1. 在文件夹C:\ Users \ XXXX \ Documents \ WindowsPowerShell \ Modules \ NTFSSecurity中创建一个名为NTFSSecurity的新文件夹,其中XXXX是您的Windows用户名。示例:如果我的用户名是“ aspnyc ”,则新文件夹将为 C:\ Users \ aspnyc \ Documents \ WindowsPowerShell \ Modules \ NTFSSecurity

  2. 下载文件系统安全性PowerShell模块软件包 -应该以简单的ZIP文件形式提供。

  3. 打开Powershell控制台,运行Get-Module -ListAvailable ,并确保NTFSSecurity显示在已注册模块列表中的某个位置。
  4. 在Powershell控制台中,运行Import-Module NTFSSecurity
  5. 在Powershell控制台中,运行Remove-Item2“ YYYY” -Recurse,其中YYYY是您要递归删除的文件夹的Windows路径(例如C:\ Potatoes \ Badgers \ FolderToDelete)。

0

我终于找到了如何在Windows 10上使用Powershell来执行此操作,其中单个文件名太长。以下是我在Windows 10上执行此操作的步骤:

  1. 下载文件系统安全性PowerShell模块软件包 -应该以简单的ZIP文件形式提供。
  2. 将Zip文件提取为目录C:\ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ Modules中的NTFSSecurity文件夹。
  3. 使用管理权限(也称为“管理模式”)打开Powershell控制台,然后运行Get-Module -ListAvailable ,并确保NTFSSecurity出现在已注册模块列表中的某个位置。
  4. 不受限制地运行Set-ExecutionPolicy以绕过已签名的执行模式。您必须用Y确认此操作
  5. 最终cd到您要删除的文件夹。
  6. 在Powershell控制台中,运行Import-Module NTFSSecurity
  7. 在Powershell控制台中,运行Remove-Item2“ YYYY” -Recurse,其中YYYY是您要递归删除的文件夹的相对或绝对Windows路径(例如C:\ Potatoes \ Badgers \ FolderToDelete)。
  8. 检查是否有效。
  9. 最终使用Set-ExecutionPolicy Restricted设置回签名执行模式。您必须通过Y(es)确认此操作。

0

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

bash -c "rm -rf dirname_here"

它启动bash,从没有文件名限制的linux递归删除目录,然后返回到常规命令提示符。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.