Вопрос Как удалить каталоги с путями / именами слишком долго для обычного удаления


При попытке удалить Windows, похоже, имеет ограничение длины на имена файлов, хотя это не будет препятствовать созданию этих файлов.

Наш процесс сборки создает несколько временных файлов (многие из них строятся из WSDL), которые преследуют этот предел. Наш скрипт 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>

Кто-нибудь знает какие-либо инструменты или простые способы обойти эту ошибку удаления без необходимости вручную находить файлы проблем и перемещать / переименовывать их?


349
2017-12-03 19:23


происхождения


Я нашел решение перед публикацией этого вопроса, но, поскольку другие могут столкнуться с этим, я решил опубликовать его, чтобы они могли найти решение, с которым я столкнулся. - Herms
О, я знаю, но обычно, когда я делаю такие вещи, я оставляю вопрос «без ответа» на некоторое время, чтобы узнать, есть ли у кого-нибудь лучшее решение. - Herms
От далеко простейшее решение: youtube.com/watch?v=qQTyTprFAOg - TaW
с помощью Ubuntu или любой другой Linux Bootable CD мы можем загрузить наш компьютер Ubuntu или любую другую ОС для временных. Затем мы можем выбрать папку, и мы можем легко ее удалить. - kelum priyadarshane
У этого более старого вопроса есть и интересные ответы: superuser.com/questions/45697/... - AdamV


ответы:


Использовать 7-Zip File Manager, чтобы удалить их. использование сдвигDEL insinde 7zip File Manager (иначе Windows пытается переместиться в Корзину, которая снова сработает).


392
2017-12-03 19:48



Спасибо - это избавилось от дерева, которое немного рекурсивно и было слишком глубоким для del / rmdir / rm / explorer, чтобы удалить - Martin Beckett
работал отлично, используя shift + Del - 7zip не смог отправить файлы с длинными патчами в корзину. - cori
+1 7zip. Вы должны перейти в папку, а затем использовать shift + Del как @cori сказал. Если вы выберете Delete вариант из контекстного меню, это WILl не работает. shift + Del Это! - Urda
7zip не работал для win7 64, поэтому Linux сделал. - Erik Friesen
Я повышаю это, потому что с помощью 7zip вы можете удалить и удалить папку, в которой хранятся длинные вложенные папки. У меня была проблема с папкой node_module, в которой содержалось множество вложенных папок, и я не смог ее удалить. 7zip исправлен из базовой папки безупречно. +1 - Gruber


Ни один из других (бесплатных) ответов здесь не работал, но я нашел один на другом сайте:

rimraf <dir>

rimraf это Node.js пакета, поэтому вам нужно будет установить Node.js, который включает НПМ, Затем вы можете запустить:

npm install -g rimraf

Затем вы можете запустить rimraf из командной строки.

Я нашел это решение, потому что сама npm вызывала эту проблему из-за того, как она устанавливает зависимости.

Кстати, rimraf получает свое имя от команды UNIX rm -rf, который рекурсивно удаляет файлы и папки.


307
2017-07-04 06:23



Пробовал много способов. Это просто отлично! - Duckegg
Лучший ответ от всех :) да его легкий beasy - Al-Mothafar
Это должен быть принятый ответ. - NINCOMPOOP
Ваше решение работает, но это так f ## k-up, что я должен использовать модуль js узла для удаления папок модулей js узла ... Я больше не хочу жить на этой планете - Benoit P
Узел создал проблему в первую очередь для меня так ... интересно ... что у них также есть решение. - Eric J.


Там есть нет необходимости устанавливать какую-либо программу для решения этой проблемы.

Эта проблема легко решается с помощью robocopy, предустановленная с Windows Vista, запущенная в 2006 году.

Например, 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. Сначала создайте пустой каталог, f.i. C:\emptyfolder,

    mkdir C: \ emptyfolder

  2. Скопируйте + обновление из пустого каталога в цель, используя опцию «/ purge»

    robocopy c: \ emptyfolder "C: \ удалить \ эту папку \ с очень длинным именем" / очистить

  3. Удалите пустой каталог. Вам это больше не нужно.

    rmdir c: \ пустая папка

Поскольку в исходной папке нет файлов или папок (C:\emptyfolder), он просто удаляет файлы и папки под целевым каталогом (C:\delete\this folder\with a very long name) рекурсивно!

  • Окончательный трюк: вы можете не писать вручную

    C: \ удалить \ эту папку \ с очень длинным именем

    Перетащив папку из окна проводника и опустив ее в окно Terminal / cmd.

Быть осторожен: Удаленные файлы не пойдет в мусор папка! После удаления файлы не могут быть восстановлены.

(Взято из «Путь слишком длинный? Используйте Robocopy» от BVLANGEN)

PS: Я понимаю, что этот ответ был здесь, менее дидактически. Как удалить файл в Windows со слишком длинным именем файла? [Дубликат]

Benoit добавлено:

Возможно, вам придется пройти этот процесс несколько раз, чтобы избавиться от всех файлов.


117
2018-03-03 16:45



Спасибо, сэр! Это должен быть принятый ответ, так как все остальные не работает или требуется Сторонний инструмент, :) - MickyD
Это прекрасно работает ... не нужно ничего устанавливать (насколько я знаю), и это быстро. Это должен быть принятый ответ! - ksumarine
Это сохраняет некоторые (или все) дерева каталогов в разделе «c: \ deletefolder» (целевой каталог). Во всяком случае, удалил все в мигание для меня (думаю, файлы были небольшими), и мне просто пришлось вручную <Del> "c: \ deletefolder", дочерние dirs были удалены без проблем. Работал как шарм. +1, должен быть принятым ответом! :) - rld.
@rld, но раньше существовала «deletefolder»? В противном случае, я думаю, он должен быть пустым, если это новый каталог. В противном случае это беспорядок. Я могу добавить последний шаг для «rmdir deletefolder». - hectorpal
@hectorpal 1. У меня было дерево с остатками резервной копии диска Windows C с другой машины, которую мне удалось удалить, за исключением очень длинных частей, т.е. "% USERPROFILE% / Foo / very_long_dirname / vldn2 / vldn3 /(...)/ very_long_filename". 2. cd ~; mkdir empty; robocopy empty foo /purge 3. Осталось с ~ / foo / maybe_something_deeper_too_cant_remember / и на самом деле не занимало больше времени для дальнейшего расследования, потому что меня уже злили на M $ за неуважение ко мне и тратили мое время, но простой <Delete> on ~ / foo in explorer удален он успешно, после неудачи бесконечно (даже с владением) до robocopy. - rld.


Я считаю, что нашел способ удалить вещи из cmd, Первоначально я попробовал del , но это не сработало. Тогда я вспомнил rmdir, Выполнение следующих действий:

rmdir /S /Q <dir>

похоже, сработало.


78
2017-12-03 19:24



Не работал для меня. :( - Andrew Arnott
не забудьте заглянуть в cmd, прежде чем пытаться запустить rmdir. - brianpeiris
Для тех, кто не может использовать это решение, у меня есть альтернативное решение, которое сработало для меня (с слишком длинными именами путей / файлов): Переместите файл (ы) / каталог в C: \, чтобы сократить путь, а затем удалите его. - Anders Sandberg Nordbø
Возможно, есть каталоги, для которых это решение не будет работать, что 7-Zip может удалить. Я просто это случилось со мной. - SamStephens
Это решение дает непоследовательные результаты. Пожалуйста, не голосуйте. - hectorpal


Инструмент, который я использовал, когда у меня была эта проблема, была FastCopy, Я выбрал Удалить все в раскрывающемся списке выберите каталог, который я хотел удалить, и нажмите Удалить все,

FastCopy delete dialog screenshot

FastCopy портативен (не требуется установка), и доступны 32-битные и 64-разрядные версии.


29
2017-11-25 20:22



Если вы ищете инструмент командной строки, вы можете использовать небольшой инструмент, который я опубликовал в GitHub (github.com/epsitec/Tools-RecursiveDelete). - Pierre Arnaud
У меня был рекурсивно сгенерированный набор вложенных файлов / папок. Это было единственное решение, - Pierluigi
Это сработало для меня, когда сбой командной строки, попытка 7zip не удалась. и даже поддержка Microsoft была в тупике! - Kit Ramos
То же самое здесь - я как-то начал удалять файлы с помощью 7zip, но он также действовал очень странно, и мне пришлось Shift + Delere каждый каталог несколько раз подряд удалять его, но затем я попробовал этот инструмент и работал как шарм , Запустил его дважды, чтобы избавиться от всех файлов. Благодаря! - Artanis
Спасибо, для меня также единственное рабочее решение, GREAT !!!! - tim


Cygwin-х rm -rf хорошо работает на длинных дорожках!


24
2017-09-26 19:40



Cygwin отлично работал для меня! Просто сделал -rm -rf, и все файлы были удалены. - Ranhiru Cooray
Работал и для меня, и для GNU bash, версия 4.1.10 (4) -release - rjzii
Отлично работает при запуске из командной строки Git Bash. Для этого я установил GitGui. - Albo Best


Без установки дополнительного программного обеспечения вы можете использовать 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

22
2017-10-28 06:09



Я попробовал все другие ответы (включая ответы на другие подобные вопросы), и это было единственное, что оказалось для меня. И это было намного быстрее. - glenneroo
Это, безусловно, лучший ответ: простые, встроенные функции, не возиться с реестром. Должен быть принятый ответ. - Kevin Roche
Легко, самый чистый и самый простой способ, спасибо Кеннет. - Seth


Просто отпустите Powershell в команду, запустив ниже:

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

21
2018-04-22 16:00



Msgstr "Каталог не пуст". К сожалению. OP хочет удалить непустую папку. - leye0


Решение Dentrasi это то, что сработало лучше всего для меня, но я хотел опубликовать конкретные шаги в ответе на верхнем уровне.

  1. Загрузите и установите последнюю стабильную сборку 7zip,
  2. Запустите 7zip File Manager (7zfm.exe).
  3. В Диспетчере файлов 7zip перейдите, чтобы вы могли видеть имя папки, которую вы хотите удалить (т. Е. Находитесь в родительской папке).
  4. Удерживайте нажатой кнопку Shift.
  5. Нажмите кнопку "Удалить", либо на клавиатуре, либо в панели инструментов 7zip File Manager; убедитесь, что вы все еще держите клавишу Shift нажатой,
  6. Нажмите кнопку "ОК"; убедитесь, что вы все еще держите клавишу Shift нажатой,

17
2018-06-25 14:19



Приятная попытка, но все же не работала для меня с рекурсивными папками из 10-х. Работал только rimraf. - Julian Knight
@JulianKnight: Да, этот подход не закончил работать для меня в 100% случаев. Я просто хотел упомянуть об этом, потому что это был один из наиболее простых процессов, и он по крайней мере работал частью времени. Единственное, что я обнаружил, что это работало 100% времени, - это сценарий сценария Powershell + NTFSSecurity, который я описал ниже. IIRC rimraf провалился при вызове, и именно так я попал в этот беспорядок. См. Этот поток Node.js: github.com/nodejs/node-v0.x-archive/issues/... - Mass Dot Net
Да, всегда будут такие проблемы. На самом деле это был код установки библиотеки Arduino IDE, который меня ввел (Java), я случайно выбрал папку, содержащую библиотеки, в качестве папки для установки библиотеки и с нее! Я убил процесс, как только понял, но уже имел 10 папок k (проклятый i7 / SSD!). Следующий основной выпуск NPM предназначен для решения многих проблем с глубокой установкой библиотеки для узла, поскольку зависимости должны выполняться из гораздо более плоская структура. Тем не менее, я действительно рад, что кто-то посадил меня на rimraf - легко и бесплатно. - Julian Knight
@JulianKnight - Да, день или два назад кто-то сказал мне, что npm3 должен помочь смягчить эти проблемы, предотвратив глубоко вложенные структуры папок зависимостей. - Mass Dot Net
Не знаю, «предотвращает ли это», но делает ли он более зависимым от вложенных зависимостей, так что если вашему основному приложению требуется библиотека X v1.0, а для библиотеки Y требуется Z, для которой также требуется X v1.0, будет использоваться библиотека верхнего уровня. В настоящее время Z установит собственную версию X. - Julian Knight


В существующих ответах уже есть две вещи.

  1. Вы можете использовать префикс пути длинной длины для доступа к длинным путям
  2. В Windows 10 вы можете включить поддержку длинного пути для общего использования - обратите внимание, однако, что не все приложения будут работать с длинными путями, вы должны протестировать старое программное обеспечение. Только программное обеспечение с соответствующей манифестной записью сможет использовать это.

Префикс длинной траектории

У Windows API есть специальная функция, которая поддерживает имена путей Unicode длиной до 32 000 символов (каждый элемент длиной до 255 символов).

Это часто ошибочно называют названием UNC, но это не связано с этим.

Префикс, используемый для указания API для использования длинных путей Unicode, является \\?\ как в:

\\?\D:\very long path

Имена 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. Если этого не существует, щелкните правой кнопкой мыши Политики и выберите в меню пункт «Новый»> «Двойник» (32-разрядное значение).
  6. Задавать 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 приложения).

Следует также отметить, что вы не можете использовать относительные имена путей с помощью этого метода.


10
2017-09-09 10:52



{48981759-12F2-42A6-A048-028B3973495F}Machineчасть пути к реестру будет отличаться на каждом компьютере - это может быть не очевидно всем - maoizm
@maoizm - хорошая точка, спасибо, что выделили это. Пожалуйста, ознакомьтесь с моим обновлением для альтернативы при использовании обновления W10 Anniversary или позже. - Julian Knight
Я пишу библиотеку под названием FoundationIO, и я пытаюсь сделать длинный путь по умолчанию, есть ли какая-либо функция, которую я могу вызвать, или макрос, который я могу настроить для автоматической поддержки длинного пути для любого пользователя моей библиотеки? - MarcusJ
Привет, Маркус, это родная библиотека Windows? Если это так, .NET имеет необходимую поддержку уже присутствующую как часть соответствующего Windows API - извините, что я не знаю деталей, поскольку я не программист .NET или Win API, но детали должны быть доступны для поиска в MSDN. - Julian Knight