Каким-то образом одна из наших старых коробок Server 2008 (не R2) разработала, казалось бы, бесконечно рекурсивную папку. Это ложная игра с нашими резервными копиями, поскольку агент резервного копирования пытается вернуться в папку и никогда не возвращается.
Структура папок выглядит примерно так:
C:\Storage\Folder1
C:\Storage\Folder1\Folder1
C:\Storage\Folder1\Folder1\Folder1
C:\Storage\Folder1\Folder1\Folder1\Folder1
... и так далее. Это как один из тех наборов Мандельброта, с которыми мы все играли в 90-х.
Я пробовал:
- Удаление его из Проводника. Да, я оптимист.
RMDIR C:\Storage\Folder1 /Q/S
- это возвращаетсяThe directory is not empty
ROBOCOPY C:\temp\EmptyDirectory C:\Storage\Folder1 /PURGE
- это прокручивает папки в течение нескольких минут, прежде чем robocopy.exe вылетает.
Кто-нибудь может предложить способ убить эту папку навсегда?
/MIR
вместо этого:ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
также может стоить запуститьchkdsk
только для хихиканья./MIR
казалось, длился дольше, но в конце концов тоже взорвался («Робокопия перестала работать»). Я немного напуган, чтобы сделатьchkdsk
; это довольно старый сервер, и я беспокоюсь, что эта проблема свидетельствует о более крупных проблемах файловой системы ...find
чтобы сделать удаление глубины первого каталога:find Storage/Folder1 -depth -exec rmdir {} \;
Ответы:
Спасибо всем за полезные советы.
Полностью перейдя на территорию StackOverflow, я решил проблему, выбрав этот фрагмент кода C #. Он использует библиотеку Delimon.Win32.IO, которая специально решает проблемы с доступом к длинным путям файлов.
На всякий случай это может помочь кому-то еще, вот код - он прошел через ~ 1600 уровней рекурсии, с которыми я как-то застрял, и занял около 20 минут, чтобы удалить их все.
источник
.Delete
(вместо обычнойSystem.IO
версии), и, хотя она не выдает исключение, она, похоже, ничего не делает. Конечно, рекурсия с использованием описанного выше метода заняла целую вечность, и она.Delete
жевала только 5-10 секунд. Может быть, он откололся в нескольких каталогах, а затем сдался?Может быть рекурсивной точкой соединения. Такую вещь можно создать с
junction
помощью файловой и дисковой утилиты от Sysinternals .И теперь вы можете бесконечно идти вниз c: \ Hello \ Hello \ Hello .... (ну, пока не будет достигнут MAX_PATH, 260 символов для большинства команд, но 32 767 символов для некоторых функций Windows API).
Список каталогов показывает, что это соединение:
Для удаления используйте утилиту соединения:
источник
DIR
просто показывает мне простые ole каталоги - я не боюсь никаких переходовjunction -s C:\Storage\Folder1
?No reparse points found
:(dir /a
чтобы увидеть «<JUNCTION>» без указания конкретного имени.Не ответ, но у меня недостаточно репутации для комментария.
Однажды я исправил эту проблему на огромном 500-мегабайтном диске FAT16 в системе MS-DOS. Я использовал отладку DOS для ручного дампа и анализа таблицы каталогов. Затем я щелкнул один бит, чтобы пометить рекурсивный каталог как удаленный. Моя копия Dettman и Wyatt 'Справочник программистов DOS' показала мне путь.
Я все еще чрезвычайно горжусь этим. Я был бы изумлен и испуган, если есть какой-либо инструмент общего назначения, который имеет такую власть над томами FAT32 или NTFS. Тогда жизнь была проще.
источник
Java также может работать с длинными путями к файлам. И это может сделать это намного быстрее тоже. Этот код (который я скопировал из документации по API Java) удалит структуру каталогов глубиной 1600 уровней примерно за 1 секунду (в Windows 7, Java 8.0) и без риска переполнения стека, поскольку он фактически не использует рекурсию.
источник
Вам не нужны длинные пути, если вы находитесь
chdir
в каталоге и просто используете относительные пути кrmdir
.Или, если у вас установлена оболочка POSIX, или перенесите это на эквивалент DOS:
(Использование переменной оболочки для отслеживания того, где вы переименовали ее для условия цикла, является другой альтернативой развертыванию цикла, как я делал там.)
Это позволяет избежать перегрузки ЦП решения KenD, которая заставляет ОС обходить дерево с вершины до
n
уровня th каждый раз, когда добавляется новый уровень, проверяя разрешения и т. Д. Таким образом, этоsum(1, n) = n * (n-1) / 2 = O(n^2)
усложняет время. Должны быть решения, которые сокращают порцию с начала цепочкиO(n)
, если только Windows не нужно обходить дерево при переименовании его родительского каталога. (Linux / Unix этого не делает.) Решения, которыеchdir
вплоть до самого дна дерева и используют относительные пути оттуда, удаляя каталоги при ихchdir
резервном копировании, также должны бытьO(n)
при условии, что ОС не нужно проверять все ваши родительские каталоги каждый системный вызов, когда вы делаете что-то, когда CD-диск где-то.find Folder1 -depth -execdir rmdir {} +
запустит rmdir, пока CDed в самый глубокий каталог. Или на самом деле-delete
опция find работает с каталогами и подразумевает-depth
. Такfind Folder1 -delete
должно делать то же самое, но быстрее. Да, GNU находит в Linux спуск, сканируя каталог, CDing в подкаталоги с относительными путями, затемrmdir
с относительным путем, затемchdir("..")
. Он не пересканирует каталоги во время возрастания, поэтому он потребляетO(n)
оперативную память.Это было действительно приближение:
strace
показывает, что оно на самом деле используетunlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
,open("..", O_DIRECTORY|...)
иfchdir(the fd from opening the directory)
с кучейfstat
вызовов тоже. Но эффект тот же, если дерево каталогов не изменяется, пока выполняется поиск.редактировать: просто для удовольствия, я попробовал это на GNU / Linux (Ubuntu 14.10, на первом процессоре Core2Duo 2,4 ГГц, на файловой системе XFS на диске Green Power WD 2,5 ТБ (WD25EZRS)).
(mkdir -p создает каталог и все отсутствующие компоненты пути).
Да, действительно 0,05 секунды для 2k rmdir ops. xfs неплохо умеет объединять операции метаданных в журнале, поскольку они исправляют медленные операции метаданных, как 10 лет назад.
На ext4 создание заняло 0m0.279s, удаление с поиском по-прежнему занимало 0m0.074s.
источник
Я столкнулся с той же проблемой с беспорядком папки более 5000 каталогов, что и некоторые Java-приложения, и я написал программу, которая поможет вам удалить эту папку. Весь исходный код находится по этой ссылке:
https://imanolbarba.net/gitlab/imanol/DiREKT
Через некоторое время все это удалилось, но ему удалось выполнить работу, я надеюсь, что это поможет людям, которые (как и я) сталкиваются с одной и той же неприятной проблемой.
источник
У меня тоже было это, на автономной системе Windows 10, хотя. C: \ User \ Name \ Repeat \ Repeat \ Repeat \ Repeat \ Repeat \ Repeat \ Repeat, по-видимому, до бесконечности.
Я мог перейти с помощью Windows или командной строки примерно на 50-й и не дальше. Я не мог удалить его или нажать на него и т. Д.
C - мой язык, поэтому в конце концов я написал программу с циклом системных вызовов, которые повторяются до тех пор, пока не завершатся неудачей. Вы можете сделать это на любом языке, даже в DOS. Я создал каталог с именем tmp и переместил в него Repeat \ Repeat, удалил пустую папку Repeat и переместил tmp \ Repeat обратно в текущую папку. Снова и снова!
ChkSystem просто запускает вызов system () и проверяет возвращаемое значение, останавливаясь, если оно не удалось.
Важно отметить, что это не удалось несколько раз. Я подумал, что, возможно, моя программа не работает или что она все равно бесконечно длинная. Однако, у меня было это раньше с системными вызовами, с вещами, которые не синхронизировались, поэтому я просто запустил программу снова, и она продолжила с того места, где она остановилась, поэтому не стоит сразу думать, что ваша программа не работает. В общем, после запуска около 20 раз, он очистил их всех. В общей сложности изначально было около 1280 папок. Понятия не имею, что вызвало это. Псих.
источник