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

Her*_*rms 411 windows file-management

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

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

有没有人知道任何工具或简单的方法来解决这个删除错误,而不必手动找到问题文件并移动/重命名它们?

Den*_*asi 468

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

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

  • 使用 shift+Del 效果很好 - 7zip 无法将长路径文件发送到回收站.... (71认同)
  • +1 7zip。您必须导航到该文件夹​​,然后像@cori 所说的那样使用`shift + Del`。如果您从上下文菜单中选择“删除”选项,它将在那里失败。`shift+Del`啦! (70认同)
  • 我赞成这一点,因为使用 7zip,您可以删除也可以删除其中包含长嵌套文件夹的文件夹。我的 node_module 文件夹有问题,其中包含大量嵌套文件夹,我无法删除它。7zip 从基本文件夹中完美修复。+1 (16认同)
  • 谢谢 - 这摆脱了一个有点递归并且对于 del/rmdir/rm/explorer 来说太深而无法删除的目录树 (8认同)
  • 7zip 不适用于 win7 64,所以 linux 可以。 (8认同)
  • 7zip 变得更棒了 (4认同)
  • 在 win7 上对我不起作用(使用 shift-del) - 收到错误“目录不为空” (4认同)
  • 除了`SHIFT + DEL`,7-Zip 还提供了`Menu Bar/View/Flat View` 选项,在我的例子中,当`cmd` 或Explorer 没有显示任何东西时,它能够列出一个所谓的递归路径的目录. (2认同)
  • 6 年后,这救了我 =D (2认同)
  • 尝试删除时我得到“目录非空”,但我只是不断重复,最终,我到了那里,文件夹终于消失了。 (2认同)

jor*_*ker 315

这里的其他(免费)答案都不适合我,但我在另一个网站上找到了一个:

rimraf <dir>
Run Code Online (Sandbox Code Playgroud)

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

npm install -g rimraf
Run Code Online (Sandbox Code Playgroud)

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

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

顺便说一下,rimraf它的名字来自 UNIX 命令rm -rf,它递归地删除文件和文件夹。

  • 您的解决方案有效,但这太f##k-up 以至于我必须使用节点 js 模块来删除节点 js 模块文件夹... *我不想再生活在这个星球上* (14认同)
  • 尝试了很多方法。这简直完美! (8认同)
  • Node首先为我创造了这个问题,所以......有趣......他们也有一个解决方案。 (4认同)
  • 最好的答案:) 是的,它很简单 (2认同)
  • 这应该是公认的答案。 (2认同)
  • +1 互联网点为您服务。对我来说,NPM 嵌套依赖也一直到地狱。 (2认同)

hec*_*pal 186

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

使用robocopy自 2006 年推出的 Windows Vista 以来预装的可以轻松解决此问题。

例如,rmdir /S /Q <dir>已报告在某些情况下失败。无需使用 7zip 或任何其他 3rd 方工具。Powershell 是一种矫枉过正。Cygwin 可以工作,但您可能没有安装它。所以,让我们专注于robocopy

这个想法是

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

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

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

假设删除的目标是:

C:\delete\this folder\with a very long name
Run Code Online (Sandbox Code Playgroud)

我们按照以下步骤进行:

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

    mkdir C:\emptyfolder
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用选项从空目录复制+更新到目标 /purge

    robocopy c:\emptyfolder "C:\delete\this folder\with a very long name" /purge
    
    Run Code Online (Sandbox Code Playgroud)
  3. 删除空目录。你不再需要它了。

    rmdir c:\emptyfolder
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 最后一个技巧:你可以避免手写

    C:\delete\this folder\with a very long name
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

PS:我意识到这个答案就在这里,而不是说教。如何在 Windows 中删除文件名过长的文件?[复制]

贝努瓦补充说:

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

  • 谢谢你好先生!!这应该是公认的答案,因为所有其他答案要么_不起作用_,要么需要_第 3 方工具_。:) (16认同)
  • 我同意@MickyD:这应该是公认的答案!我现在经常使用我的“指定空目录”: robocopy C:\Users\&lt;me&gt;\empty &lt;Whatever_directory_needs_emptying&gt; \purge &gt;nul 虽然我在同步目录时喜欢 robocopy 诊断,但我想默默地删除东西...... (2认同)

Her*_*rms 89

我相信我已经找到了一种从cmd. 最初我尝试了该del命令,但是没有用。然后我想起来了rmdir。执行以下操作:

rmdir /S /Q <dir>
Run Code Online (Sandbox Code Playgroud)

似乎奏效了。

  • 没有为我工作。:( (107认同)
  • 对于那些无法使用此解决方案的人,我有一个对我有用的替代解决方案(路径/文件名太长):将文件/目录移动到 C:\ 以缩短路径,然后从那里删除。 (9认同)
  • 可能存在此解决方案不适用的目录,7-Zip 可以删除该目录。我刚遇到这种情况。 (6认同)
  • 此解决方案获得了不一致的结果。请不要投票。 (2认同)

bra*_*rry 30

我遇到这个问题时使用的工具是FastCopy。我从下拉列表中选择Delete All,选择我想要删除的目录,然后单击Delete All

FastCopy 删除对话框截图

FastCopy 是可移植的(无需安装),并且有 32 位和 64 位版本可用。

  • 如果您正在寻找命令行工具,您可以使用我在 GitHub (https://github.com/epsitec/Tools-RecursiveDelete) 上发布的一个小工具。 (3认同)
  • 当命令行失败,7zip 尝试失败时,这对我有用。甚至微软的支持也被难住了! (2认同)

Ken*_*h L 29

无需安装其他软件,您可以使用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"
Run Code Online (Sandbox Code Playgroud)

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

subst x: /d
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最好的答案:简单、内置功能,无需与注册表打交道。应该是公认的答案。 (2认同)

gdw*_*dw2 27

Cygwinrm -rf在长路径上运行良好!

  • Cygwin 非常适合我!刚刚做了一个 -rm -rf 并且所有文件都被删除了。 (3认同)
  • 在 GNU bash 版本 4.1.10(4)-release 下也为我工作 (3认同)
  • 从 Git Bash 命令窗口运行时效果很好。我为此安装了 GitGui。 (2认同)

小智 23

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

Cmd /C "rmdir /S /Q <dir>" 
Run Code Online (Sandbox Code Playgroud)

  • “目录不为空”。哎呀。OP 想要删除一个非空文件夹。 (4认同)

小智 20

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

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


Jul*_*ght 15

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

  1. 您可以使用扩展长度路径前缀来访问长路径
  2. 在 Windows 10 中,您可以为一般用途启用长路径支持 - 但是请注意,并非所有应用程序都可以使用长路径,您应该测试较旧的软件。只有具有适当清单条目的软件才能使用它。

长路径前缀

Windows API 有一个特殊的函数,它支持长达 32k 个字符的 Unicode 路径名(每个元素的长度最多为 255 个字符)。

这通常被错误地称为 UNC 命名,但实际上并不是相关的。

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

\\?\D:\very long path
Run Code Online (Sandbox Code Playgroud)

UNC 名称通常用于以\\servername\path name\file name. 您可以将其与长路径前缀结合使用,以便:\\?\UNC\server\share

请注意,一些写得不好但很普遍的应用程序不支持 UNC 文件路径,也不支持长路径前缀。

参考:https : //msdn.microsoft.com/en-gb/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. 如果它不存在,请右键单击 Policies,然后从菜单中选择 New > Dword (32-bit) Value。
  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)
Run Code Online (Sandbox Code Playgroud)

这仍然仅适用于专门设置为使用它的应用程序(需要应用程序的 manifest.xml 中的条目)。

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


Use*_*ser 9

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

rm -f

(或rm -rf文件夹)


Ana*_*nov 8

我喜欢 cmd 解决方案。虽然我想分享另一种甚至仅适用于资源管理器的解决方法:尝试在删除之前缩短父文件夹的名称:较短的名称将缩短路径。说,你有这个文件夹的树结构:

C:\

.. 项目

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

.. .. .. 周五市内公园活动

.. .. .. .. bla bla bla bla bla bla bla bla bla bla bla bla

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

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

C:\

.. 项目

.. .. X

.. . . . y

.. .. .. z

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

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