Как я могу удалить каталог 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 работает так же, как требуется при удалении - цели соединения остаются неизменными.

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

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