在Perl脚本中删除Windows符号链接?
假设我创建某些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在该版本中不能在我想要使用的符号链接上正常工作(they delete symbolic link contents instead of the symlinks)。
如果我尝试:
use File::Path qw(rmtree) ;
rmtree(['withlink']) ;
这工作得很好,我提供没有任何目录的符号链接(如一个在创造最上面的链接序列REM生成的),然后Perl的rmtree最终会像cygwin一样行事,我最终删除了原始目录中的目录内容。
有没有人有我可以使用的备用perl递归目录删除方法的建议。我想到的只是一个外壳标注:
system("rd /s /q withlink") ;
但这需要我测试平台,并有不同的Windows和Unix的Perl代码。
编辑: 请注意,与Unix不同,unlink()不能用于删除目录符号链接,至少在我们的构建系统当前使用的perl v5.6.0中是如此。但是,rmdir()确实可以删除Windows目录符号链接。
您应该在perl脚本中使用unlink("FILE_FOO");
调用。它是便携式的。
不能,不能解除链接,也不能使用rmdir与目录符号链接正常工作。我应该在我对这个问题的描述中提到这一点。 – 2012-03-02 19:59:09
更正。取消链接不适用于Windows上的目录符号链接(与unix上的取消链接不同)。 rmdir()似乎是Windows目录符号链接所必需的。 – 2012-03-02 20:42:01
您必须使用rmdir
来删除Windows中的目录符号链接和联结点,并且您必须使用简单unlink
删除符号链接到文件。原因在于目录符号链接和联结点实际上是一个带有附加文件系统元数据的空目录(称为重解析点数据)。类似地,符号链接到文件是重分析点数据的空文件。当您阅读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中查询这些文件系统标记的方法,或者你是否需要编写调用FindFirstFile(和朋友)的C代码? – 2012-03-19 16:15:16
是的,我确实有C++代码,可以查询/设置/删除这些重分析标签,这些标签可以在Windows XP及以上版本中使用。该代码太长并且很复杂,无法在此处发布,因此需要编写有关该代码的完整文章。它主要基于我的实验和阅读MSDN。从Vista开始,您可以使用'CreateSymbolicLink'函数创建符号链接或'CreateHardLink'(XP及更高版本)来创建硬链接。我更新了我的答案 - 如何检测链接/路口 - 请参阅上文。 – sirgeorge 2012-03-19 20:37:32
如果您尝试....什么? – 2012-03-01 18:32:03
对不起,在我还在问我的问题时,我稍微编辑了我的标题,并且过早地和无意地以不完整的状态提交了问题。 – 2012-03-01 18:37:19
感谢您的更新! – 2012-03-01 18:43:19