Как я могу удалить каталог Windows без соблюдения точек соединения?

StackOverflow https://stackoverflow.com/questions/2003174

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть 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, похоже, скопированы как обычные папки, но их содержимое пустое.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top