2012-01-31 53 views
7
if (-e "$ENV{MYHOME}/link") { 
    system("rm $ENV{MYHOME}/link"); 
} 

这是用于检查符号链接是否存在的代码,如果存在,则将其删除。如何使用Perl检查并删除符号链接(如果存在)?

我正在跟踪此代码无法运行的错误。我目前还无法弄清楚,但是发生的情况是这段代码无法删除符号链接,从而导致文件存在错误。

我想检查这种技术是否存在一些根本缺陷?我还阅读了关于http://perldoc.perl.org/functions/unlink.html,但想知道目前的方法是否由于某种原因不被推荐?

回答

19

只需使用的可能性:

if (-l "$ENV{MYHOME}/link") { 
    unlink "$ENV{MYHOME}/link" 
     or die "Failed to remove file $ENV{MYHOME}/link: $!\n"; 
} 

如果取消链接失败时,它会说为什么。 -l询问目标是否是链接。 -e询问文件是否存在。如果你的链接是不存在的文件,它将返回false,你的代码将无法删除链接。

+0

确实'-l'检查文件是符号链接还是硬链接?或两者? – mask8 2014-06-06 06:15:03

+0

@ mask8 - “-l”如果路径是符号链接,则返回true。硬链接文件显示为常规文件,唯一不同的是它们的链接数(来自stat的st_nlink)大于1。目录不能在Linux/Unix中被硬链接。 – unpythonic 2018-01-26 00:51:39

0

您的代码将只具有所运行用户的权限。这个符号链接是否可能由另一个用户拥有,而且不可写?

而且,总是有$ ENV {} MYHOME不包含你所想象的那样......

+0

是的,这是我正在研究的一种可能性,这是可能的,但不应该发生。 – Lazer 2012-01-31 03:36:11

+0

顺便说一下,取消链接的效率要高得多,因为您不会分叉另一个进程。另外,我不知道你的系统负载有多重或发生的频率如何,但分叉这样的系统调用会打开类似于你的pid表的内容充满并且无法分叉的可能性。 – 2012-01-31 04:03:52

0

各个操作系统都有自己的errno.h。我会用Errno.pm来处理每个错误。

use Errno; 
use File::Spec; 

my $dir = File::Spec->catfile($ENV{MYHOME}, 'link'); 

if (!unlink $dir) { 
    if ($! == Errno::ENOENT) { 
     die "Failed to remove '$dir'. File doesn't exist:$!"; 
    } 
} 
+0

倒退?为什么忽略“真实”的错误,只打印无关紧要的错误。 – ikegami 2012-01-31 06:46:44

+2

PS - '使用Errno;如果($!== Errno :: ENOENT)'也可以写成'if($!{ENOENT})''。 – ikegami 2012-01-31 06:48:24

+0

感谢您的回复,ikegami。真正的错误是区域敏感的,不适用于处理。无论如何,我不知道'%!'成语。 +1 – ernix 2012-01-31 14:40:03