65

Eclipse создал временную папку в одной из директорий, которая достаточно глубоко вложена, например

dir1\dir1\dir1\dir1\...

Я не могу удалить эту папку в Windows через проводник, команды del или rmdir или команду Cygwin 'rm'. Как мне удалить эту очень длинную папку?

Он просто продолжает говорить "Имя файла слишком длинное ..."

17 ответов17

96

Если вы похожи на меня и не любите устанавливать дополнительное программное обеспечение для решения такой проблемы, я бы воспользовался предложением XQYZ и использовал robocopy для решения этой проблемы. (В моем случае проблема была создана в первую очередь с помощью robocopy, путем копирования каталога с рекурсивными точками соединения без предоставления /XJ для robocopy).

Чтобы удалить дерево каталогов, начинающееся с c:\subdir\more\ Offnding_dir:

Весь пошаговый процесс так же прост:

  1. cd c:\subdir\more для перехода в его родительский каталог.
  2. mkdir empty для создания пустой директории.
  3. robocopy empty offending_dir /mir для зеркалирования пустого каталога в каталог-нарушитель.
  4. После некоторого ожидания все готово! Завершите это с:
  5. rmdir offending_dir чтобы избавиться от теперь пустой папки нарушителя и
  6. rmdir empty чтобы избавиться от вашего промежуточного пустого каталога.
38

Это на самом деле довольно просто исправить. Скажем, что структура каталогов такова:

C:\Dir1\Dir1\Dir1\Dir1…

Чтобы исправить это, просто переименуйте каждую папку в одно-символьное имя папки, пока она не станет слишком длинной для удаления:

  1. Переименуйте C:\Dir1 в C:\D
  2. Перейдите к C:\D\
  3. Переименуйте C:\D\Dir1 в C:\D\D
  4. Перейдите к C:\D\D\
  5. Переходите к 1, пока общая длина пути не станет <260

Вот пакетный файл для автоматизации процесса (эта простая версия лучше всего подходит для простых каталогов, подобных описанным в вопросе, особенно для одноразовых). Передайте ему максимально возможную папку (например, C:\Dir1 для C:\Dir1\Dir1\Dir1… или C:\Users\Bob\Desktop\New Folder для C:\Users\Bob\Desktop\New Folder\abcdefghi…)

@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _ 
%0 
popd

Техническое объяснение

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

Когда вы пытаетесь получить доступ к каталогу, вы делаете это, используя его абсолютный путь, явно или нет, который включает в себя все, что было до него. Следовательно, для структуры каталогов, такой как C:\Dir1\Dir1\Dir1\Dir1 , длина пути к самому внутреннему Dir1 равна 22. Однако длина пути к самому внешнему Dir1 составляет всего 7, и, следовательно, он по-прежнему доступен независимо от его содержимого (в контексте пути к указанному каталогу файловая система не знает, что она содержит, или какое влияние она оказывает на общая длина пути его дочерних каталогов; только его родительские каталоги - вы не можете переименовать каталог, если общая длина пути будет слишком большой).

Поэтому, когда вы сталкиваетесь с слишком длинным путем, вам нужно перейти на максимально возможный уровень, переименовать его в односимвольное имя и повторить для каждого уровня в нем. Каждый раз, когда вы это делаете, общая длина пути сокращается на разницу между старым именем и новым именем.

Также верно и обратное. Вы не можете создать путь, который превышает максимальную поддерживаемую длину (в DOS и Windows MAX_PATH = 260). Тем не менее, вы можете переименовать каталоги, работая изнутри наружу, в более длинное имя. В результате более глубокие папки, абсолютный путь которых> 260, будут недоступны. (Это не делает их «скрытыми» или безопасными, поскольку к ним достаточно просто добраться, поэтому не используйте этот метод для скрытия файлов.)


Интересная сторона Примечание

Если вы создаете папки в Windows 7 Explorer, может показаться, что Explorer позволяет вам создавать подкаталоги так, чтобы общая длина была больше, чем MAX_PATH , и в действительности это так, но на самом деле это обман, используя «DOS 8.3 filenames». Вы можете увидеть это, создав дерево, например:

C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
   \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
     \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
       \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
        \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
          \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
           \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
            \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\

Это 696 символов, что, конечно, намного длиннее, чем 260. Кроме того, если вы переходите к самому внутреннему подкаталогу в Проводнике, он показывает его, как и ожидалось, в адресной строке, когда он не в фокусе, но когда вы щелкаете в адресной строке, он меняет путь на C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ , длина которого составляет всего 102 символа.

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

Что было бы действительно интересно, так это узнать, как Windows 7 Explorer обрабатывает «слишком длинные пути», когда установлена опция NtfsDisable8dot3NameCreation .

16

Вы можете сократить путь, используя subst для создания виртуального диска:

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"

Перейдите на виртуальный диск:

cd Z:

Теперь вы можете удалить файлы:

del *.*

Удалить виртуальный диск:

cd C:\TEMP
subst Z: /d

Удалить каталог:

rd /s dir1
10

Я написал небольшое приложение на C #, чтобы помочь мне удалить похожую очень глубокую структуру, созданную небрежным использованием Robocopy и резервной копии с Homeserver; по умолчанию Robocopy рассматривает точки соединения как обычные папки ... :-( Вы можете получить большой беспорядок, не заметив этого.

Этот инструмент доступен на CodePlex с исходными файлами для любого пользователя.

http://deepremove.codeplex.com

7

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

Используя эту автономную утилиту, вы можете просто:

deletefiles c:\yourfolder\subfolder\*.* -r -f

удалить всю структуру папок. -r возвращает иерархию папок из начального каталога вниз, -f удаляет все пустые папки (которые будут всеми, если вы используете . как спецификацию файла). DeleteFiles поддерживает пути длиннее, чем предел Windows MAX_PATH, поэтому он будет отлично работать на глубоко вложенных папках.

DeleteFiles является бесплатным и открытым исходным кодом, и вы можете получить двоичный или исходный код из GitHub или установить непосредственно с помощью Chocolatey

5

Просто и легко сейчас

я так долго сталкивался с этой же проблемой с node_modules, которые очень вложенные папки. поэтому, наконец, сделал скрипт для исправления того, что может удалять папки путем сокращения путей.

https://github.com/dev-mraj/fdel

npm install fdel -g

fdel ./node_modules
4

Во время работы с Sikuli меня задело рекурсивным циклом Calculator.sikuli в программе, которая создала бесчисленное количество каталогов «calculator.sikuli.calculator.sikuli». Я мог бы переместить дерево, но путь слишком длинный для удаления.

Попробовав несколько решений с помощью popd loop, Scandisk и ничего не получилось (ощутимо) ....

Я написал этот сценарий, чтобы «углубиться» в рекурсивные каталоги (в каталог с именем «a»), переместить их (в каталог с именем «b»), затем удалить усеченное дерево, переместить их обратно (в «a») и повторите:

1)cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
.............go deeeeeep in         dir *A*
2) move calculator.sikuli ---> D:\b    
.............move the crazy tree to dir *B*    
3) kill D:\a\calculator.sikuli <---KILL(rd)    
.............wipe dir *A*'s tree    
4) move D:\b\calculator.sikuli ---> D:\a\    
.............move the crazy tree back to dir *A*    
REPEAT
  • REM Используется для удаления бесконечно рекурсивных подпапок.
  • REM предлагает сначала остановить службу поиска Windows (services.msc)

Remdirs.bat

D:
cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
move /-Y calculator.sikuli D:\b
cd D:\b
rd /s/q D:\a\calculator.sikuli
move /-Y calculator.sikuli D:\a
call D:\remdirs2.bat

Это просто вызов для повторного запуска командного файла.

2

У нас была такая проблема на работе, когда Eclipse решила создать мусор на жестких дисках. Мы исправили это, используя функцию Robocopy /MIR для зеркалирования пустого каталога во вложенный.

1

Откройте командную строку.

Перейдите к папке / каталогу, который содержит самый высокий 'dir1' (предположим, C:\)

c:\> RD /s dir1

Изменить (после добавления комментариев):

Другие идеи:

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

Также есть этот инструмент (никогда не использовал его лично) - TooLongPath.

Возможно, напишите что-нибудь (поскольку у вас есть Eclipse), которое полностью перемещается, а затем выполняет возврат на один уровень папок за раз, удаляя по ходу дела?

1

Я бы попробовал открыть командную строку и запустить:

rmdir /s <directory>

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

1

Если это сетевая папка, просто поделитесь родительским каталогом этого каталога и сопоставьте его с диском на вашем локальном компьютере, а затем удалите папку.

1

Другое решение: иди скачай Total Commander. Это очень полезная программа, не только потому, что она знает длинные имена файлов.

Незарегистрированная версия - Nagware, но полностью работоспособна, она сделает свою работу.

1

Это можно сделать непосредственно из командной строки или в пакетном файле, создав UNC-путь к каталогу, который вы хотите удалить.

так вместо

rmdir /s/q c:\mydirectory

использование

rmdir /s/q \\?\c:\myDirectory

Такие пути в стиле UNC могут быть намного длиннее и обходить ограничение в 260 символов.

0

У меня была та же проблема, за исключением того, что она была создана рекурсивной задачей Cobian Backup. Я выяснил, что бесплатное программное обеспечение Cobian включает приложение Deleter, которое может легко и быстро быстро удалить эти надоедливые вложенные папки.

Он расположен под меню инструментов.

0

Когда у меня возникает эта проблема, я просто переименовываю некоторые имена папок намного короче, а затем, когда общий путь становится достаточно коротким, он удаляет OK. Никаких дополнительных инструментов не требуется.

0

Я столкнулся с той же проблемой с беспорядком папки более 5000 каталогов, что и некоторые Java-приложения, и я написал программу, которая поможет вам удалить эту папку. Весь исходный код находится по этой ссылке:

https://gitlab.imanolbarba.net/imanol/DiREKT

Через некоторое время все это удалилось, но это удалось сделать, я надеюсь, что это помогает людям, которые (как и я) сталкиваются с одной и той же неприятной проблемой

-3

Ваша файловая система может быть повреждена. Запустите chkdsk, чтобы увидеть, восстанавливает ли он что-либо, затем попробуйте удалить папку.

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