Как проверить и удалить символическую ссылку, если она существует, используя Perl? - PullRequest
8 голосов
/ 31 января 2012
if (-e "$ENV{MYHOME}/link") {
    system("rm $ENV{MYHOME}/link");
}

Этот код используется для проверки наличия символической ссылки и удаления, если она есть.

Я отслеживаю ошибку, когда этот код не работает.Я до сих пор не смог выяснить это, но происходит то, что этот код не может удалить символическую ссылку, что приводит к ошибке «Файл существует».

Я хотелпроверить, есть ли какой-то фундаментальный недостаток в этой технике?Я также читал о http://perldoc.perl.org/functions/unlink.html, но хотел бы знать, если текущий подход не рекомендуется по какой-то причине?

Ответы [ 3 ]

22 голосов
/ 31 января 2012

Просто используйте:

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

Если разорвать связь не удастся, она скажет почему. -l спрашивает, является ли цель ссылкой. -e спрашивает, существует ли файл. Если ваша ссылка на несуществующий файл, она вернет false, и ваш код не сможет удалить ссылку.

0 голосов
/ 31 января 2012

Соответствующие операционные системы имеют свои 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 голосов
/ 31 января 2012

Ваш код будет иметь права только пользователя, под которым он работает. Возможно ли, что символическая ссылка принадлежит другому пользователю и недоступна для записи?

Кроме того, всегда существует вероятность того, что $ ENV {MYHOME} не содержит того, что вы думаете, он делает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...