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

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

Наш процесс сборки создает несколько временных файлов (многие из них строятся из WSDL), которые работают с этим ограничением. Наш скрипт ant может как-то удалять их при чистке, но иногда мне нужно удалить каталог workarea (где все временные файлы идут), не выполняя при этом полного очищения от муравья.

Это те же ошибки этот вопрос , но ответы там действительно не работают для меня, поскольку я имею дело с каталогом, а не с файлом, и я не всегда знаю, какие конкретные файлы или подкаталоги вызывают проблему. И я пытаюсь избежать любого ручного процесса (кроме запуска одной команды), чтобы фактически удалить их.

Если я попытаюсь удалить каталог из проводника, я получаю сообщение об ошибке

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>

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

346 голосов | спросил Herms 3 ThuEurope/Moscow2009-12-03T22:23:09+03:00Europe/Moscow12bEurope/MoscowThu, 03 Dec 2009 22:23:09 +0300 2009, 22:23:09

22 ответа


78

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

rmdir /S /Q <dir>

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

ответил Herms 3 ThuEurope/Moscow2009-12-03T22:24:08+03:00Europe/Moscow12bEurope/MoscowThu, 03 Dec 2009 22:24:08 +0300 2009, 22:24:08
391

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

ответил Dentrasi 3 ThuEurope/Moscow2009-12-03T22:48:56+03:00Europe/Moscow12bEurope/MoscowThu, 03 Dec 2009 22:48:56 +0300 2009, 22:48:56
306

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

rimraf <dir>

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

npm install -g rimraf

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

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

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

ответил jordanbtucker 4 J000000Friday14 2014, 10:23:55
115

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

Эту проблему легко решить с помощью 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: \ empty folder

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

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

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

    rmdir c: \ empty folder

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

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

      

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

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

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

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

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

Benoit добавил:

  

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

ответил hectorpal 3 MarpmThu, 03 Mar 2016 19:45:54 +03002016-03-03T19:45:54+03:0007 2016, 19:45:54
29

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

Скриншот окна удаления FastCopy

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

ответил braveterry 25 22014vEurope/Moscow11bEurope/MoscowTue, 25 Nov 2014 23:22:32 +0300 2014, 23:22:32
24

Cygwin's code rm -rf отлично работает на длинных путях!

ответил gdw2 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 26 Sep 2014 23:40:05 +0400 2014, 23:40:05
21

Без установки дополнительного программного обеспечения вы можете использовать команду 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
ответил Kenneth L 28 +03002014-10-28T09:09:34+03:00312014bEurope/MoscowTue, 28 Oct 2014 09:09:34 +0300 2014, 09:09:34
20

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

Cmd /C "rmdir /S /Q <dir>" 
ответил Karl Glennon 22 PMpFri, 22 Apr 2011 20:00:01 +040000Friday 2011, 20:00:01
17

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

  1. Загрузите и установите последнюю стабильную сборку 7zip .
  2. Запустите 7zip File Manager ( 7zfm.exe ).
  3. В Диспетчере файлов 7zip перейдите, чтобы вы могли видеть имя папки, которую вы хотите удалить (т. е. находитесь в родительской папке).
  4. Удерживайте нажатой клавишу Shift.
  5. Нажмите кнопку « Удалить » либо на клавиатуре, либо на панели инструментов 7zip File Manager; убедитесь, что вы все еще удерживаете клавишу Shift .
  6. Нажмите кнопку « OK »; убедитесь, что вы все еще держите клавишу Shift нажатой .
ответил Mass Dot Net 25 J0000006Europe/Moscow 2015, 17:19:53
10

В существующих ответах уже не упоминаются две вещи.

  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. Если этого не существует, щелкните правой кнопкой мыши Политики и выберите «Создать> Dword (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)

Это работает только для приложений, которые специально настроены для его использования (требуется запись в манифесте application.xml).

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

ответил Julian Knight 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 09 Sep 2016 13:52:17 +0300 2016, 13:52:17
8

Мне нравится решение cmd. Хотя я хочу поделиться другим обходным решением, которое работает даже в Explorer: сначала попробуйте сократить имена родительских папок до удаления: более короткие имена сократят путь. Скажем, у вас есть эта древовидная структура папки:

C: \

.. Проекты

.. .. Удивительный проект весной 2014 года

.. .. .. Некоторые виды деятельности в парке в городе в пятницу

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

.. .. .. .. .. Фактические файлы с длинными именами, тоже

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

C: \

.. Проекты

.. .. x

.. .. .. y

.. .. .. .. z

.. .. .. .. .. Фактические файлы с длинными именами, тоже

В моем случае я просто хотел удалить всю папку со многими подпапками и файлами. Поэтому мне не нравились имена папок.

ответил Anatoly Mironov 28 +03002014-10-28T08:52:15+03:00312014bEurope/MoscowTue, 28 Oct 2014 08:52:15 +0300 2014, 08:52:15
6

7-zip-решение отлично работает. Другой вариант, если у вас установлен git, - открыть оболочку bash и использовать:

rm -f

(или rm -rf для папок)

ответил User 11 Jpm1000000pmMon, 11 Jan 2016 17:22:54 +030016 2016, 17:22:54
4

Я предлагаю Total Commander (условно-бесплатное, но продолжает работать после пробного периода с минимальным стартовым экраном начала ). Именно так я всегда решаю проблемы слишком долгое имя файла .

ответил Sopalajo de Arrierez 29 PMpTue, 29 Apr 2014 19:47:23 +040047Tuesday 2014, 19:47:23
2

Вы также можете удалить их, используя их эквивалентное короткое имя. dir /x покажет вам их.

ответил Ian Boyd 6 62010vEurope/Moscow11bEurope/MoscowSat, 06 Nov 2010 19:24:27 +0300 2010, 19:24:27
2

Я создал простую java-программу, которая использует robocopy для удаления файлов. Банка является управляемой. Для дополнительного вывода запустите его из строки cmd.

https://drive.google.com/file/d /0B5pSEjxJvt_1WVp1T3puSm1CNjg /вид? УСП = совместное использование

ответил CamHart 9 FebruaryEurope/MoscowbMon, 09 Feb 2015 00:07:55 +0300000000amMon, 09 Feb 2015 00:07:55 +030015 2015, 00:07:55
1

Я пробовал все остальные ответы, но они не работали (по крайней мере для меня).

Я наткнулся на delinfile и работал довольно хорошо и довольно быстро!

Это пробный период ограничен 3 действиями /15 днями, но он может использоваться, если вы хотите удалить только несколько папок /файлов:

ответил Jürgen Paul 20 FriEurope/Moscow2013-12-20T10:10:00+04:00Europe/Moscow12bEurope/MoscowFri, 20 Dec 2013 10:10:00 +0400 2013, 10:10:00
1

Большие каталоги также предназначены для этой задачи. введите описание изображения здесь

  • Загрузить
  • Использует рекурсивный вызов с RemoveDirectoryW для удаления существующих каталогов
  • Использует собственный репозиторий файлов для вновь созданных каталогов
  • Файлы могут быть перемещены из каталогов до удаления каталогов containg.
  • Speedy, хотя переход к началу каталога - это щелчок по вложенному каталогу
  • Windows XP (SP3) и
  • Беззнаковый неуправляемый код без установщика, поэтому возможно предупреждение Smartscreen при запуске из резервной папки, например. рабочий стол.

Дополнительная информация в CodeProject .

ответил Laurie Stearn 9 Jpm1000000pmMon, 09 Jan 2017 15:08:22 +030017 2017, 15:08:22
1

Я столкнулся с этой проблемой в Windows 10 и нашел это простое решение.

  1. Входите немного глубже в дерево папок.
  2. Перетащите папку из середины дерева в начало дерева, используя адресную строку.
  3. Как на моем изображении перетащите красную рамку в зеленый квадрат. (в этом случае путь короче, но для длинных путей он также работает)
  4. Затем ваш путь становится короче и удаляется как обычно, используя ключ удаления.

 введите описание изображения здесь>> </a> </p></body></html>

ответил Nayana Adassuriya 13 J0000006Europe/Moscow 2017, 10:52:13
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/ан-нас /библиотека /aa365247.aspx # maxpath

Ни один альтернативный ответ в 4-х вопросах не был достаточным для моих нужд. Добро пожаловать в мир.

ответил Andrew 28 +03002017-10-28T03:35:26+03:00312017bEurope/MoscowSat, 28 Oct 2017 03:35:26 +0300 2017, 03:35:26
0

Наконец-то я узнал, как это сделать через Powershell. Вот инструкции, которые я выполнил, чтобы заставить это работать в Windows 7:

  1. Создайте новую папку с именем NTFSSecurity в папке C: \ Users \ XXXX \ Documents \ WindowsPowerShell \ Modules \ NTFSSecurity , где XXXX является вашим именем пользователя Windows. Пример: если мое имя пользователя было « aspnyc », новая папка была бы C: \ Users \ aspnyc \ Documents \ WindowsPowerShell \ Modules \ NTFSSecurity .

  2. Загрузите Пакет модулей PowerShell для системы безопасности файлов - он должен быть доступен как простой ZIP-файл .

  3. Откройте консоль Powershell, запустите Get-Module -ListAvailable и убедитесь, что NTFSSecurity отображается где-то в списке зарегистрированных модулей.
  4. В консоли Powershell запустите Импорт-модуль NTFSSecurity .
  5. В консоли Powershell запустите Remove-Item2 "YYYY" -Recurse , где ГГГГ - это путь Windows к папке, которую вы хотите рекурсивно удалить (например, C: \ Potatoes \ Badgers \ FolderToDelete ).
ответил Mass Dot Net 25 J0000006Europe/Moscow 2015, 19:47:36
0

Наконец-то я узнал, как это сделать с Powershell в Windows 10, где отдельные имена файлов были слишком длинными. Вот шаги, которые я выполнил, чтобы заставить это работать в Windows 10:

  1. Загрузите Пакет модулей PowerShell для системы безопасности файлов - он должен быть доступен как простой ZIP-файл.
  2. Извлеките Zip-файл как папку NTFSSecurity в каталог C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ Modules.
  3. Откройте консоль Powershell с административной высотой (режим администрирования a.k.a.) и запустите Get-Module -ListAvailable и убедитесь, что NTFSSecurity отображается где-то в списке зарегистрированных модулей.
  4. Запустите Set-ExecutionPolicy Unrestricted , чтобы обойти подписанный режим выполнения. Вы должны подтвердить это действие с помощью Y (es)
  5. В конечном итоге cd в папку, которую вы хотите удалить.
  6. В консоли Powershell запустите Импорт-модуль NTFSSecurity .
  7. В консоли Powershell запустите Remove-Item2 "YYYY" -Recurse , где ГГГГ - относительный или абсолютный путь к папке, которую вы хотите рекурсивно удалить ( например C: \ Potatoes \ Badgers \ FolderToDelete ).
  8. Проверьте, не сработало ли оно.
  9. В конце концов вернется в подписанный режим выполнения с Set-ExecutionPolicy Restricted . Вы должны подтвердить это действие с помощью Y (es).
ответил Epicurist 9 +03002015-10-09T19:08:22+03:00312015bEurope/MoscowFri, 09 Oct 2015 19:08:22 +0300 2015, 19:08:22
0

Если у вас установлен Bash на Ubuntu на Windows, вы можете cd в родительский каталог в обычной командной строке, а затем введите:

bash -c "rm -rf dirname_here"

Что запускает bash, рекурсивно удаляет каталог из linux, где нет ограничений на имя файла, а затем возвращается в вашу обычную командную строку.

ответил Richard Szalay 5 J000000Wednesday17 2017, 13:44:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132