删除perl脚本中的Windows符号链接?

前端之家收集整理的这篇文章主要介绍了删除perl脚本中的Windows符号链接?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我创建了一些 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 ..

我可以用shell删除包含符号链接的目录

rd /s /q withlink

我在perl脚本中有同样的任务要做,我们目前使用的是cygwin’rm -rf’.不幸的是我们正在使用cygwin 1.5和rm和rm -rf在我想使用的符号链接上的版本中无法正常工作(they delete symbolic link contents instead of the symlinks).

如果我尝试:

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

这很好用,只要我没有任何目录符号链接(比如上面的create-the-links序列中的REM),那么perl的rmtree最终表现得像cygwin,我最终得到了目录内容我的原始目录已删除.

有没有人建议我可以使用备用perl递归目录删除方法.我想到了一个shell标注:

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

但这需要我测试平台并为Windows和Unix提供不同的perl代码.

编辑:
请注意,与Unix不同,unlink()不能删除目录符号链接,至少使用perl v5.6.0,这是我们的构建系统当前使用的.但是,rmdir()确实可以删除Windows目录符号链接.

解决方法

您必须使用rmdir删除Windows中的目录符号链接和连接点,您必须使用简单的取消链接删除文件的符号链接.原因是目录符号链接和连接点实际上是一个空目录,带有其他文件系统元数据(称为重新分析点数据).类似地,文件的符号链接是具有重新分析点数据的空文件.当您阅读Microsoft NTFS文档时,这样的目录或文件称为重新分析点.重分析点类型由所谓的重新分析点TAG确定.用户可以看到两个重新分析点标记为“链接”:

> IO_REPARSE_TAG_SYMLINK – 如果在目录上设置 – 它是目录的符号链接,如果在文件中设置 – 它是文件的符号链接
> IO_REPARSE_TAG_MOUNT_POINT – 只能在目录上设置 – 它被称为“连接点”.它可以“链接”到另一个目录,但它可以是整个设备(卷)的“挂载点”.

总结一下:

>您将符号链接删除到目录和连接点,就像它们是空目录一样(事实上,如果您检查这样的事物的属性,它有两个:FILE_ATTRIBUTE_DIRECTORY和FILE_ATTRIBUTE_REPARSE_POINT).
>您将符号链接删除文件,就像它们是文件一样.
>在上面提到的两种情况中 – 仅删除链接/连接(不是目标).
>要确定文件/文件夹是否为链接(所有类型):如果调用GetFileAttributes或GetFileInformationByHandle或FindNextFile,则attributtes包含FILE_ATTRIBUTE_REPARSE_POINT标志(例如:WIN32_FIND_DATA :: dwFileAttributes).如果它是指向目录的链接,它还包含标志FILE_ATTRIBUTE_DIRECTORY(参见1.).

希望有所帮助.

猜你在找的Perl相关文章