Как я могу удалить каталог Windows без следующих точек соединения? - PullRequest
6 голосов
/ 05 января 2010

У меня есть скрипт Perl, который должен удалить каталог со всем его содержимым. Иногда этот каталог содержит точку соединения с другим каталогом. Если я rmtree() наивно, вызов rmtree() также удалит все файлы в целевой папке соединения. Я ищу способ не делать этого, а вместо этого просто удалить перекресток.

Решения не Perl также приветствуются.

Ответы [ 3 ]

6 голосов
/ 05 января 2010

Я просто набрал "точку соединения" в Google и нашел способ http://en.wikipedia.org/wiki/NTFS_junction_point

Командная строка (cmd.exe)

  • Режиссёр команда в Windows 2000 или новее распознает точки соединения, отображая вместо того, чтобы в списки каталогов (используйте каталог с Переключатель командной строки / A или / AL).
  • Любой команды, которые обычно влияют файлы внутри обычной директории будут Действуйте так же здесь. Таким образом, команда del myjunction не должен использоваться - это просто удалит все файлы в целевой каталог.
  • Команды Rmdir и двигаться хорошо работать с узлы, с оговоркой, которые движутся не позволит переходу перейти на другой громкость (в отличие от Windows Проводник, как упомянуто выше.)
  • The Команда rmdir безопасна тем, что только удаляет точку соединения, а не целевые файлы. Пока идет через каталог с командной строкой интерфейс, файлы могут быть удалены, но в отличие от проводника, каталоги также могут быть удаленным (используя rmdir / s dirname для пример.)
  • Использование команды linkd с ключ / d - это безопасный способ удаления точки соединения.

Из того, что я вижу, вы можете, например, использовать dir и получить вывод для <JUNCTION> или использовать Windows rmdir. Я думаю, что вы можете использовать любой из них из Perl через system.

4 голосов
/ 08 августа 2010

Чтобы узнать, где находятся точки повторного анализа (или «точки соединения», если хотите):

dir /a:l /b > myjunctions.txt

Показывает все точки повторной обработки в текущем каталоге. Вы можете добавить / s, но помните, что точки повторной обработки внутри точек повторной обработки будут также перечислены.

Предположим, что myjunctions.txt содержит строку x: \ subdir \ foo. Чтобы удалить его, вы выдаете

fsutil reparsepoint "x:\subdir\foo"

И вуаля! Ваша точка соединения исчезла, а исходный каталог не тронут!

3 голосов
/ 25 июня 2011

Утилита FastCopy делает это: http://ipmsg.org/tools/fastcopy.html.en

Я использую эту программу для копирования или удаления папок, которые могут содержать соединения в качестве подпапок, поэтому цели соединения остаются нетронутыми. Точки соединения правильно копируются во время копирования, даже если целевой диск отличается.

Проводник Windows, по крайней мере, в Windows 7 Ultimate работает также, как требуется, при удалении - цели соединения остаются неизменными.

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

...