удалить символические ссылки Windows в скрипте Perl?

Предположим, я создаю некоторые символические ссылки 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.

7
задан Peeter Joot 2 March 2012 в 20:45
поделиться