Как удалить папку, которая вложена достаточно глубоко и избежать "Имя файла слишком длинное"?

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

dir1\dir1\dir1\dir1\...

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

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

17 ответов

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

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

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". Вы можете увидеть это, создав дерево, например:

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 опция установлена.

Вы можете сократить путь, используя 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

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

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

http://deepremove.codeplex.com/

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

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

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

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

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

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

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

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

npm install fdel -g

fdel ./node_modules

Во время работы с 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

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

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

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

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

c:\> RD /s dir1

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

Другие идеи:

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

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

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

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

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

rmdir /s <directory>

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

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

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

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

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

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

так вместо

rmdir /s/q c:\mydirectory

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

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

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

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

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

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

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

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

Другие вопросы по тегам