удалить символические ссылки Windows в Perl-скрипте? - PullRequest
7 голосов
/ 01 марта 2012

Предположим, я создал несколько символических ссылок Windows, например:

rd /s /q source withlink linkdir
mkdir source
mkdir withlink
echo blah > source/myfile
cd withlink
touch blah
mklink mylink ..\source\myfile
@REM mklink /d linkdir ..\source
cd ..

Я могу удалить каталог, содержащий символические ссылки в оболочке, с помощью

rd /s /q withlink

У меня та же задача, чтобысделать в Perl-скрипте, где мы в настоящее время используем cygwin 'rm -rf'.К сожалению, мы используем cygwin 1.5, а rm и rm -rf не работают должным образом в этой версии с символическими ссылками, которые я хотел бы использовать ( они удаляют содержимое символических ссылок вместо символических ссылок ).

Если я попытаюсь:

use File::Path qw( rmtree ) ;
rmtree( ['withlink'] ) ;

Это прекрасно работает, при условии, что у меня нет символьных ссылок в каталоге (например, REM, описанных выше в последовательности создания ссылок),затем rmtree в perl ведет себя как cygwin, и я в итоге удаляю содержимое каталога моего исходного каталога.

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

system("rd /s /q withlink") ;

, но для этого нужно протестировать платформу и использовать другой код perl для Windows и Unix.

РЕДАКТИРОВАТЬ: обратите внимание, что в отличие от Unix, unlink () не работает для удаления символьной ссылки на каталог, по крайней мере с perl v5.6.0, который в настоящее время используется нашей системой сборки.Тем не менее, rmdir () работает для удаления символической ссылки на каталог Windows.

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Вы должны использовать rmdir, чтобы удалить символические ссылки и точки соединения в Windows, и вы должны просто использовать unlink, чтобы удалить символические ссылки на файлы. Причина в том, что символьная ссылка и точка соединения каталога - это на самом деле пустой каталог с дополнительными метаданными файловой системы (которые называются данные точки повторной обработки ). Аналогично, символические ссылки на файлы являются пустыми файлами с данными точки повторной обработки . Такой каталог или файл называется точка повторной обработки , когда вы читаете документацию Microsoft NTFS. Тип точки повторной обработки определяется так называемой точкой повторной обработки TAG . Есть два тега точек повторной обработки, видимые пользователям как «ссылки»:

  1. IO_REPARSE_TAG_SYMLINK - если установлен на каталог - это символическая ссылка на каталог, если установлен на файл - это символическая ссылка на файл
  2. IO_REPARSE_TAG_MOUNT_POINT - можно установить только для каталога - это так называемая «точка соединения». Это может быть «ссылка» на другой каталог, но это может быть «точка монтирования» для всего устройства (тома).

Подведем итог:

  1. Вы удаляете символические ссылки на каталоги и точки соединения, как если бы они были пустыми каталогами (фактически, если вы проверяете атрибуты такого объекта, у него есть два: FILE_ATTRIBUTE_DIRECTORY и FILE_ATTRIBUTE_REPARSE_POINT).
  2. Вы удаляете символические ссылки на файлы, как если бы они были файлами.
  3. В обоих случаях, упомянутых выше, удаляется только ссылка / соединение (не цель).
  4. Чтобы узнать, является ли файл / папка ссылкой (все виды): если вы звоните GetFileAttributes или GetFileInformationByHandle или FindNextFile, тогда атрибуты содержат флаг FILE_ATTRIBUTE_REPARSE_POINT (например, WIN32_FIND_DATA::dwFileAttributes). Если это ссылка на каталог, он также содержит флаг FILE_ATTRIBUTE_DIRECTORY (см. 1. ).

Надеюсь, это поможет.

0 голосов
/ 02 марта 2012

Вы должны использовать unlink("FILE_FOO"); call в Perl-скрипте. Это портативный.

...