Как я могу удалить каталог Windows без следующих точек соединения?
У меня есть Perl-скрипт, который должен удалить каталог со всем его содержимым. Иногда этот каталог содержит точку соединения с другим каталогом. Если я rmtree()
наивно rmtree()
Вызов также удалит все файлы в целевой папке соединения. Я ищу способ не делать этого, а вместо этого просто удалить перекресток.
Не Perl решения также будут оценены.
3 ответа
Я просто набрал "точку соединения" в Google и нашел свой путь к http://en.wikipedia.org/wiki/NTFS_junction_point
Командная строка (cmd.exe)
- Команда dir в Windows 2000 или более поздней версии распознает точки соединения, которые отображаются вместо списков каталогов (используйте dir с параметром командной строки /A или /AL).
- Любые команды, которые обычно влияют на файлы внутри обычного каталога, будут действовать здесь одинаково. Таким образом, команда del myjunction не должна использоваться - она просто удалит все файлы в целевом каталоге.
- Команды rmdir и 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 работает так же, как требуется при удалении - цели соединения остаются неизменными.
Но копирование папок, которые содержат соединения в качестве вложенных папок в проводнике, по-прежнему не работает должным образом - на самом деле оно выполняет то, что я пока не могу, возможно, полностью описать: папки для соединений, кажется, копируются как обычные папки, но их содержимое пусто.