2009-12-03 19:23:09 +0000 2009-12-03 19:23:09 +0000
387
387

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

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>

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

Ответы (23)

432
432
432
2009-12-03 19:48:56 +0000

Используйте 7-Zip File Manager для их удаления.

Если у вас все еще возникают проблемы, убедитесь, что вы используете Shift+Delete внутри 7-Zip File Manager. В противном случае Windows попытается переместить их в Корзину (что опять не удастся).

311
311
311
2014-07-04 06:23:55 +0000

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

rimraf <dir>

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

npm install -g rimraf

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

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

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

155
155
155
2016-03-03 16:45:54 +0000

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

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

Например, rmdir /S /Q <dir>, как сообщается, не удалось в некоторых случаях. Нет необходимости использовать 7zip или любой другой инструмент сторонних производителей. Powershell - это перебор. Cygwin может работать, но вы можете не установить его. Итак, давайте сосредоточимся на robocopy

Идея заключается в

  1. используйте robocopy для копирования+обновления
  2. из new empty folder
  3. в папку, которую вы хотите удалить, целевую.

После выполнения robocopy целевая папка также будет пустой.

Эти инструкции предназначены для командной строки. Просто откройте поиск в Windows, введите cmd и нажмите Enter.

Допустим, target для удаления:

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

Мы действуем следующим образом:

  1. Сначала создадим пустой каталог, f.i. C:\emptyfolder.

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

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

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

  • Последний трюк: вы можете избежать записи от руки

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

(Взято из “Path too long? Use Robocopy” by BVLANGEN )

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

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

86
86
86
2009-12-03 19:24:08 +0000

Думаю, я нашел способ удалить вещи из & 007. Первоначально я пробовал команду cmd, но это не сработало. Потом я вспомнил del. Делать следующее:

rmdir /S /Q <dir>

, кажется, сработало.

30
30
30
2014-11-25 20:22:32 +0000

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

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

26
26
26
2014-09-26 19:40:05 +0000

Cygwin’s rm -rf хорошо работает на длинных дорогах!

26
26
26
2014-10-28 06:09:34 +0000

Без установки дополнительного программного обеспечения вы можете использовать команду 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
22
22
2011-04-22 16:00:01 +0000

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

Cmd /C "rmdir /S /Q <dir>"
18
18
18
2015-06-25 14:19:53 +0000

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

  1. Скачайте и установите последнюю стабильную сборку 7zip .
  2. Запустите 7zip File Manager ( 7zfm.exe ).
  3. В файловом менеджере 7zip перейдите так, чтобы увидеть имя папки, которую вы хотите удалить (т.е. вы находитесь в родительской папке).
  4. Удерживайте нажатой кнопку Shift.
  5. Нажмите кнопку “Delete” либо на клавиатуре, либо на панели инструментов 7zip File Manager; чтобы убедиться, что вы все еще держите нажатой клавишу Shift.
  6. Нажмите кнопку “OK”; убедитесь, что вы все еще держите нажатой клавишу Shift.
12
12
12
2016-09-09 10:52:17 +0000

Есть две вещи, которые еще не упомянуты в существующих ответах.

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

Префикс длинного пути

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

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

Префикс, используемый для указания API использовать длинные юникодные пути, это `\?Есть две вещи, которые еще не упомянуты в существующих ответах.

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

Префикс длинного пути

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

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

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

\?\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. Если его нет, щелкните правой кнопкой мыши на Policy (Политики) и выберите New > Dword (32-bit) Value (Новое >Слово (32-bit) Value (Новое ) из меню.
  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/

UPDATE 2017-04-09

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

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

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

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

8
8
8
2014-10-28 05:52:15 +0000

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

C:\

… Проекты

… … Некоторые удивительные проекты весной 2014

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

… … Бла бла бла бла бла бла бла бла бла

… … … Актуальные файлы с длинными именами, также

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

C:\

… Проекты

… … x

… … y

… … … z

… … … Актуальные файлы с длинными именами тоже

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

7
7
7
2016-01-11 14:22:54 +0000

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

rm -f

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

4
4
4
2014-04-29 15:47:23 +0000

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

2
2
2
2015-02-08 21:07:55 +0000

Я создал простую java-программу, которая использует робокопирование для удаления файлов. Банку можно запускать. Для дополнительного вывода выполните ее из командной строки. _COPY13_1WVp1T3puSm1CNjg/view?usp=sharing

2
2
2
2010-11-06 16:24:27 +0000

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

1
1
1
2013-12-20 06:10:00 +0000

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

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

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

1
1
1
2017-10-28 00:35:26 +0000

Получил идеальный ответ здесь (для файлов). Работает в 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/en-us/library/aa365247.aspx#maxpath

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

1
1
1
2017-01-09 12:08:22 +0000

Bigger Directories - Для этой задачи также.

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

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

1
1
1
2017-06-13 07:52:13 +0000

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

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

.

0
0
0
2015-06-25 16:47:36 +0000

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

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

  2. Скачайте пакет File System Security PowerShell Module - он должен быть доступен в виде простого 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
0
0
2015-10-09 16:08:22 +0000

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

  1. Загрузите пакет File System Security PowerShell Module - он должен быть доступен в виде простого ZIP файла.
  2. Извлеките Zip-файл в виде папки NTFSSecurity в каталоге C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules.
  3. Откройте консоль Powershell с административным уровнем (также известным, как Admin Mode) и запустите Get-Module -ListAvailable и убедитесь, что NTFSSecurity отображается где-то в списке зарегистрированных модулей.
  4. Запустите Set-ExecutionPolicy Unrestricted, чтобы обойти подписанный режим исполнения. Вы должны подтвердить это действие Y(es)
  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
0
0
2019-07-16 21:25:40 +0000

Перейдите в каталог WinRAR, выберите файл, нажмите F2, переименуйте файл в более короткий. Затем вы можете удалить файл как обычно.

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

0
0
0
2017-07-05 10:44:55 +0000

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

bash -c "rm -rf dirname_here"

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

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

3
19
10
28
11