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'] ) ;
这很好用,只要我没有任何目录符号链接(比如上面的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目录符号链接.
解决方法
> 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.).
希望有所帮助.