365

Похоже, что 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>

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

22 ответа22

410

Используйте 7-Zip File Manager, чтобы удалить их.

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

306

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

rimraf <dir>

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

npm install -g rimraf

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

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

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

127

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

Эта проблема легко решается с помощью 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. Сначала создайте пустой каталог, например 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.

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

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

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

Бенуа добавил:

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

81

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

rmdir /S /Q <dir>

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

29

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

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

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

26

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

24

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

subst x: /d
22

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

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

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

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

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

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

Длинный путь префикса

Windows API имеет специальную функцию, которая поддерживает имена путей Unicode длиной до 32 тыс. Символов (каждый элемент длиной до 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. Если он не существует, щелкните правой кнопкой мыши Policies и выберите New> Dword (32-bit) Value из меню.
  6. Установите для LongPathsEnabled значение 1 чтобы включить.

Любые приложения с соответствующими записями манифеста теперь будут иметь доступ к стандартным длинным путям POSIX. Это должно включать приложения Магазина Windows.

Ссылка: 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 приложения).

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

8

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

C:\

.. проектов

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

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

.. .. .. .. Бла бла бла бла бла бла бла бла бла бла бла бла бла бла

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

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

C:\

.. проектов

.. .. Икс

.. .. .. у

.. .. .. .. з

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

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

7

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

rm -f

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

4

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

2

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

2

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

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

1

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

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

Больше информации на CodeProject.

1

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

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

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

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/en-us/library/aa365247.aspx#maxpath

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

1

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

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

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 , где YYYY - это путь Windows к папке, которую вы хотите рекурсивно удалить (например, C:\Potatoes\Badgers\FolderToDelete ).
0

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

  1. Загрузите пакет Модуль PowerShell для безопасности файловой системы - он должен быть доступен в виде простого ZIP-файла.
  2. Извлеките Zip-файл как папку NTFSSecurity в каталоге C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules.
  3. Откройте консоль Powershell с правами администратора (режим администратора) и запустите Get-Module -ListAvailable и убедитесь, что NTFSSecurity отображается где-то в списке зарегистрированных модулей.
  4. Запустите Set-ExecutionPolicy Unrestricted, чтобы обойти подписанный режим выполнения. Вы должны подтвердить это действие с помощью Y (es)
  5. В конце концов перейдите к папке, которую вы хотите удалить.
  6. В консоли Powershell запустите модуль импорта NTFSSecurity .
  7. В консоли Powershell запустите Remove-Item2 "YYYY" -Recurse , где YYYY - относительный или абсолютный путь Windows к папке, которую вы хотите рекурсивно удалить (например, C:\Potatoes\Badgers\FolderToDelete ).
  8. Проверьте, сработало ли это.
  9. В конце концов вернитесь в режим подписанного выполнения с Set-ExecutionPolicy Restricted . Вы должны подтвердить это действие с помощью Y (es).
0

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

bash -c "rm -rf dirname_here"

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .