8

На одном из наших файловых серверов Windows 2003 кто-то или что-то сумел создать бесконечно повторяющиеся деревья каталогов в некоторых из домашних папок пользователей, и они не могут быть удалены.

Вы получаете что-то вроде этого:

D:\Student\2012\user.name\servername\student\2012\user.name\servername\student\2012\...

И это продолжается бесконечно, насколько я могу судить.

Попытка удалить дерево каталогов из системы приводит к появлению сообщения «Ошибка при удалении файла или папки: невозможно удалить файл:». Попытка удалить его из системы Windows 7, подключенной к общей сетевой папке, приводит к ошибке "папка используется".

Если вы пройдете по дереву каталогов до конца, то в конечном итоге получите каталог, который невозможно открыть или удалить (если щелкнуть правой кнопкой мыши, ни одна из стандартных опций не появится), однако, если вы попытаетесь открыть тот же каталог из общего ресурса в другой системе его можно открыть, однако Windows Explorer становится очень медленным.

Я попробовал предложения в этом посте, а также загрузил сервер с диска Linux и попытался найти каталог в rm -rf, но ничего не получилось.

Это загадка

Изменить: Я также мог бы добавить, что можно переименовать каталоги, но не удалять их.

11 ответов11

10

У меня также была бесконечно рекурсивная папка, созданная java IDE, и я не смог удалить ее ни в проводнике Windows, ни в командной строке cmd.

Однако, когда я установил git, я также установил git-bash. В git-bash вы можете выполнить команду:

rm -rfd recursive_folder_name

и это позаботится об этом.

3

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

Попробуйте выполнить команду:

dir D:\Student\2012\user.name\servername

и посмотрите, помечен ли student как DIR или SYMLINK/JUNCTION.

Например, это типичный вывод команды dir :

04/24/2012  10:58 PM    <DIR>          .
04/24/2012  10:58 PM    <DIR>          ..
04/24/2012  10:58 PM    <SYMLINKD>     a [h:\a]

Вы видите, что первые две записи помечены как DIR , а третья (символическая ссылка на другую папку) помечена как SYMLINKD . В вашем случае (Windows 2003) Я думаю , что есть JUNCTION s вместо SYMLINK s.

Если папка student является символической ссылкой или соединением, выполните команды:

cd /d D:\Student\2012\user.name\servername
rmdir student

и таким образом избавиться от рекурсии.

2

Возможно, кто бы ни работал в этой папке, ему удастся создать точку соединения, которая зацикливается обратно от user.name к servername , создавая, таким образом, дерево каталогов «бесконечный цикл».

Соединения - это функция файловой системы NTFS, которая позволяет создавать символическую ссылку на каталог, который работает как псевдоним для каталога. http://en.wikipedia.org/wiki/NTFS_junction_point

В разделе "Наблюдаемые эффекты" на вики-странице вы можете увидеть проблему, которую вы описываете.

Попробуйте запустить эту утилиту, чтобы получить список соединений на этом сервере:

http://technet.microsoft.com/en-us/sysinternals/bb896768

Это также должно дать вам возможность удалить точку соединения.

2

У меня была похожая проблема, когда Eclipse создал очень глубокое дерево папок, которое я не мог удалить. Однако, так как было возможно перемещать и переименовывать папки, я написал пакетный файл для работы, он спустился по дереву, удаляя папки по одной за раз, и это сработало! Для очевидно бесконечно глубокого дерева папок FOLDERNAME в каталоге C, т.е.

C:/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/...

Пакетный файл:

:LoopStart
REN "C:/*FOLDERNAME*" "*TEMPFOLDERNAME*"
MOVE "C:/*TEMPFOLDERNAME*/*FOLDERNAME*" "C:/"
RMDIR /S /Q "C:/*TEMPFOLDERNAME*"
GOTO LoopStart
:LoopEnd

Это работает, потому что TEMPFOLDERNAME теперь является деревом конечной длины (одна папка, в которой ничего нет), а в массивном дереве FOLDERNAME каждый раз при запуске цикла появляется на одну папку меньше, в конечном итоге достигнув дна, удалив папку сверху.

1

Решил мои бесконечные циклы каталогов с помощью этого скрипта:

:LoopStart
takeown /F "c:\temp\Application Data"
Attrib -S -H "c:\temp\Application Data"
REN "C:\temp\Application Data" "5"
takeown /F "c:\temp\5\Application Data"
Attrib -S -H "c:\temp\5\Application Data"
MOVE "c:\temp\5\Application Data" "C:\temp"
Del /F /S /Q c:\temp\5\*.*
RMDIR /S /Q "C:\temp\5"
GOTO LoopStart
:LoopEnd
1

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

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

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

0

У меня такая же проблема. Папка, которую я хотел удалить, содержала бесконечное дерево ссылок на одно и то же имя, и каждая попытка удалить его вызвала ошибку Windows «Файл слишком длинный ...». Сбой произошел независимо от команды, которую я пытался включить, включая все перечисленные выше методы, поэтому я попробовал команду Cygwin "rm" в окне cmd чуть выше рассматриваемой папки. Я ввел «rm -r -f [папка]», и папка была удалена без жалоб.

Вы можете скачать Cygwin бесплатно с https://cygwin.com/install.html. По сути, это оболочка UNIX для Windows, которая содержит все общие команды (например, ls, rm, du и cat), но также содержит массу пакетов, которые, если все они будут загружены, занимают около 1 ГБ пространства. Я считаю, что пакет загрузки по умолчанию включает в себя команды UNIX. Если нет, они входят в комплект утилит, если память не изменяет.

ПРИМЕЧАНИЕ. Вам не нужно запускать команды Cygwin в собственном окне оболочки bash. Их можно запустить в окне cmd, добавив путь к каталогу "bin" cygwin в системную переменную среды PATH. В моем случае я добавил "C:\cygwin64\bin".

Надеюсь, это поможет.

0

С 3-х уровневыми циклами каталогов:

:LoopStart
takeown /F "D:\temp\MyApp"
Attrib -S -H "D:\temp\MyApp"
REN "D:\temp\MyApp" "5"
takeown /F "D:\temp\5\MqttObserver"
Attrib -S -H "D:\temp\5\MqttObserver"
REN "D:\temp\5\MqttObserver" "6"
takeown /F "D:\temp\5\6\PackageFiles"
Attrib -S -H "D:\temp\5\6\PackageFiles"
REN "D:\temp\5\6\PackageFiles" "7"
MOVE "c:\temp\5" "C:\temp"
Del /F /S /Q c:\temp\5\*.*
RMDIR /S /Q "C:\temp\5"
MOVE "c:\temp\6" "C:\temp"
Del /F /S /Q c:\temp\6\*.*
RMDIR /S /Q "C:\temp\6"
MOVE "c:\temp\7" "C:\temp"
Del /F /S /Q c:\temp\7\*.*
RMDIR /S /Q "C:\temp\7"
GOTO LoopStart
:LoopEnd
0

У меня такая же проблема здесь.

В других сообщениях предлагалось отразить пустую папку в целевой папке через сетевой ресурс с помощью MS RoboCopy.

В этот момент я запускаю это, с "> nul" для ускорения (это действительно так):

«C:\TEMP» - это пустая папка, а «W:\TMP» - это уязвимая папка:

robocopy /mir c:\temp \127.0.0.1 \w $ \tmp> nul

0

У меня тоже было это, на автономной системе Windows 10. C:\User\Name\Repeat\Repeat\Repeat\Repeat\Repeat\Repeat\Repeat, по-видимому, до бесконечности.

Согласно OP, я мог перейти с помощью Windows или командной строки примерно на 50-й и не дальше. Я не мог удалить его или щелкнуть по нему и т.д. В точности так, как описано.

C - мой язык, поэтому в конце концов я написал программу с циклом системных вызовов, которые повторяются до тех пор, пока они не завершатся неудачей. Согласно DOS-коду от JohnO, я создал каталог с именем tmp и переместил туда Repeat\Repeat, удалил пустую папку Repeat и переместил tmp\Repeat обратно в текущую папку. Снова и снова!

 while (times<2000)
 {
  ChkSystem("move Repeat\\Repeat tmp");
  ChkSystem("rd Repeat");
  ChkSystem("move tmp\\Repeat Repeat");
  ++times;
  printf("Removed %d nested so far.\n", times);
 }

ChkSystem просто запускает вызов system() и проверяет возвращаемое значение, останавливаясь, если оно не удалось.

Важно отметить, что это не удалось несколько раз. Я подумал, что, возможно, моя программа не работает или что она все равно бесконечно длинна. Однако у меня было это раньше с системными вызовами, с вещами, которые не синхронизировались, поэтому я просто снова запустил программу, и она продолжилась с того места, где она остановилась, так что не думайте, что ваша программа не работает. В общей сложности, после запуска около 20 раз, он очистил их всех. В общей сложности изначально было около 1280 папок. Понятия не имею, что вызвало это. Псих.

-1

Просто запустите MS ROBOCOPY следующим образом:

  1. Создайте "пустую папку" с тем же именем, что и папка, которая содержит "бесконечно повторяющееся дерево каталогов".
  2. Запустите ROBOCOPY из командной строки с параметром /MIR.
  3. После окончания РОБОКОПИИ (и это может занять несколько секунд),
  4. Удалите папку с "бесконечно повторяющимся деревом каталогов", которое теперь является "пустой папкой".
  5. Также продолжайте и удалите "пустую папку", которую вы создали в Шаге 1.

, , , , , , , , , , , , , , ,

РОБОКОПИЯ "C:\anyplace\BADFOLDER" "C:\wherever\BADFOLDER" /MIR

Куда:

C:\anyplace\BADFOLDER .. "созданная вами" пустая папка ", и

C:\wherever\BADFOLDER .. - это папка, в которой находится "бесконечно повторяющееся дерево каталогов".

, , , , , , , , , , , , , , ,

После того, как РОБОКОПИЯ бежит .. Теперь у вас есть два "пустых" BADFOLDERS.

Чтобы очистить, удалите оба

C:\ где угодно \ BADFOLDER и C:\ везде где \ BADFOLDER

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