it-swarm-ru.tech

Как удалить каталоги с путями

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

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

371
Herms

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

rmdir /S /Q <dir>

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

83
Herms

Используйте файловый менеджер 7-Zip , чтобы удалить их.

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

420
Dentrasi

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

rimraf <dir>

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

npm install -g rimraf

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

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

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

310
jordanbtucker

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

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

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

Идея состоит в том, чтобы

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

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

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

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

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

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

  1. Сначала создайте пустой каталог, f.i. 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 с слишком длинным именем файла? [дубликат]

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

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

136
hectorpal

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

FastCopy delete dialog screenshot

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

29
braveterry

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

26
gdw2

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

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

Cmd /C "rmdir /S /Q <dir>" 
22
Karl Glennon

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

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

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

  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 приложения).

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

10
Julian Knight

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

C: \

.. Проекты

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

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

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

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

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

C: \

.. Проекты

.. .. Икс

.. .. .. у

.. .. .. .. з

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

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

8
Anatoly Mironov

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

rm -f

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

7
User

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

4
Sopalajo de Arrierez

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

2
Ian Boyd

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

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

2
CamHart

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

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

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

1
Laurie Stearn

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

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

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

1
Jürgen Paul

Получил идеальный ответ здесь (для файлов). Работает в 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
Andrew

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

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

 enter image description here

1
Nayana Adassuriya

Я наконец-то узнал, как это сделать с помощью 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
Mass Dot Net

Я наконец-то узнал, как это сделать с помощью 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. В конце концов перейдите к папке, которую вы хотите удалить.
  6. В консоли Powershell запустите Импорт-модуль NTFSSecurity .
  7. В консоли Powershell запустите Remove-Item2 "YYYY" -Recurse , гдеYYYY- относительный или абсолютный путь Windows к папке, которую вы хотите рекурсивно удалить (например, C:\Potatoes\Badgers\FolderToDelete).
  8. Проверьте, сработало ли это.
  9. В конце концов вернитесь в режим подписанного выполнения с помощью Set-ExecutionPolicy Restricted . Вы должны подтвердить это действие с помощью Y (es).
0
Epicurist

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

bash -c "rm -rf dirname_here"

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

0
Richard Szalay