假设我创建了一些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 ..
Run Code Online (Sandbox Code Playgroud)
我可以用shell删除包含符号链接的目录
rd /s /q withlink
Run Code Online (Sandbox Code Playgroud)
我在perl脚本中执行相同的任务,我们目前使用cygwin'rm -rf'.不幸的是我们正在使用cygwin 1.5并且rm和rm -rf在我想使用的符号链接上不能在该版本中正常工作(它们删除了符号链接内容而不是符号链接).
如果我尝试:
use File::Path qw( rmtree ) ;
rmtree( ['withlink'] ) ;
Run Code Online (Sandbox Code Playgroud)
这很好用,只要我没有任何目录符号链接(就像上面的create-the-links序列中的REM一样),然后perl的rmtree最终表现得像cygwin,我最终得到了目录内容我的原始目录已删除.
有没有人建议我可以使用备用perl递归目录删除方法.我想到了一个shell标注:
system("rd /s /q withlink") ;
Run Code Online (Sandbox Code Playgroud)
但这需要我测试平台并为Windows和Unix提供不同的perl代码.
编辑:请注意,与Unix不同,unlink()不能删除目录符号链接,至少使用perl v5.6.0,这是我们的构建系统当前使用的.但是,rmdir()确实可以删除Windows目录符号链接.
您必须使用rmdir来删除 Windows 中的目录符号链接和连接点,并且必须使用简单的unlink来删除文件的符号链接。原因是目录符号链接和连接点实际上是一个带有附加文件系统元数据(称为重解析点数据)的空目录。类似地,文件的符号链接是带有重分析点数据的空文件。当您阅读 Microsoft NTFS 文档时,这样的目录或文件称为重分析点。重解析点类型由所谓的重解析点 TAG确定。有两个重新分析点的标签对用户可见作为“链接”:
总结一下:
GetFileAttributes或GetFileInformationByHandle或FindNextFile则属性包含FILE_ATTRIBUTE_REPARSE_POINT标志(例如:WIN32_FIND_DATA::dwFileAttributes)。如果它是一个目录链接,它还包含标志FILE_ATTRIBUTE_DIRECTORY(参见1.)。希望有帮助。