Как я могу удалить каталог Windows без соблюдения точек соединения?
Вопрос
У меня есть Perl-скрипт, которому необходимо удалить каталог со всем его содержимым.Иногда этот каталог содержит точку перехода в другой каталог.Если я rmtree()
наивно, что rmtree()
вызов также удалит все файлы внутри целевой папки соединения.Я ищу способ не делать этого, а вместо этого просто удалить соединение.
Также были бы оценены решения, отличные от Perl.
Решение
Я просто набрал "точка соединения" в Google и нашел свой путь к http://en.wikipedia.org/wiki/NTFS_junction_point
Командная строка (cmd.exe)
- Команда dir в Windows 2000 или более поздней версии распознает точки соединения, отображая вместо этого в списках каталогов (используйте dir с помощью параметра командной строки /A или /AL).
- Любые команды, которые обычно влияют на файлы внутри обычного каталога, будут действовать здесь так же.Таким образом, команда del myjunction не должна использоваться — это просто удалит все файлы в целевом каталоге.
- Команды rmdir и move отлично работают с соединениями, с оговоркой, что move не позволит соединению переместиться на другой том (в отличие от Windows Explorer, как упоминалось выше.).
- Команда rmdir безопасна в том смысле, что она только удаляет точку соединения, а не целевые файлы.Во время перехода по каталогу с командной строкой интерфейс, файлы могут быть удалены, но в отличие от проводника, каталоги также могут быть удалены (используя rmdir /s dirname для примера.)
- Использование команды linkd с переключатель /d - это безопасный способ удаления точек соединения.
Из того, что я вижу, вы можете, например, использовать dir
и grep вывод для <JUNCTION>
или используйте Windows rmdir
.Я думаю, вы можете использовать любой из них из Perl через system
.
Другие советы
Чтобы узнать, где находятся точки повторного анализа (или, если хотите, "точки соединения"):
dir /a:l /b > myjunctions.txt
Будут показаны все точки повторной обработки в текущем каталоге.Вы можете добавить / s, но имейте в виду, что точки повторной обработки внутри точек повторной обработки также будут перечислены.
Предположим, myjunctions.txt содержит строку x:\subdir\foo.Чтобы удалить его, вы выдаете
fsutil reparsepoint "x:\subdir\foo"
И вуаля!Ваша точка соединения исчезла, а исходный каталог нетронутым!
Утилита FastCopy делает это: http://ipmsg.org/tools/fastcopy.html.en
Я использую эту программу для копирования или удаления папок, которые могут содержать соединения в качестве вложенных папок, чтобы целевые объекты соединения оставались нетронутыми.Точки соединения правильно копируются при копировании, даже если целевой диск отличается.
Проводник Windows, по крайней мере, в Windows 7 Ultimate, работает также так, как требуется при удалении - цели соединения остаются нетронутыми.
Но копирование папок, содержащих соединения в качестве вложенных папок в Проводнике, по-прежнему работает не так, как предполагалось, - на самом деле это делает то, что я, возможно, пока не могу полностью описать:папки junction, похоже, скопированы как обычные папки, но их содержимое пустое.