Как создать символическую ссылку с помощью Perl? - PullRequest
4 голосов
/ 23 октября 2011

Я пытаюсь запустить следующий код в Perl:

symlink($oldname,$newname) or die print "$!\n";

но я получаю сообщение об ошибке:

The symlink function is unimplemented at C:\...\CreateSymlink.pl line 14.

Если я изменю код на:

link($oldname,$newname) or die print "$!\n";

тогда жесткие ссылки создаются без ошибок.

Использование ActiveState Perl и 32-битной Windows 7.

Есть идеи, почему это происходит? Я пытаюсь создать символические ссылки для файла.

П.С .: Я новичок в Perl.

Ответы [ 2 ]

9 голосов
/ 23 октября 2011

Какой «вид» «символической ссылки»? ; -)

Да, и прочитайте символическую ссылку на статью в Википедии выше для команды mklink ;-) Обратные тики (или система) может быть хорошим другом, но обратите внимание:

Параметры безопасности по умолчанию в Windows Vista / Windows 7 запрещают администраторам без прав доступа и всем пользователям, не имеющим прав администратора, создавать символические ссылки. Это поведение можно изменить [с помощью параметра политики безопасности] ....

Счастливого кодирования.


Функция WinAPI CreateSymbolicLink может использоваться напрямую; Я не уверен, что он "страдает" от того же ограничения, что и команда mklink выше. Однако этот поток указывает, что он все еще действует.


FWIW, это «работает» в Strawberry Perl 5.12. YMMV, я только напечатал это и никогда не использовал это иначе: -)

use Win32::API;
$fn = Win32::API->new(
    # Note "A" function, IDK how to use Unicdoe
    "kernel32", "BOOLEAN CreateSymbolicLinkA(LPTSTR lpSymlinkFileName, LPTSTR lpTargetFileName, DWORD flags)"
);

unlink("src.txt");
unlink("lnk.txt");
open(FH,">src.txt") or die $!;
close(FH);

print "src.txt exists? " , (-f "src.txt"), "\n";
print "lnk.txt exists? " , (-f "lnk.txt"), "\n";
$hr = $fn->Call("lnk.txt", "src.txt", 0);
print "Result: ", $hr, "\n";
print "lnk.txt exists? ", (-f "lnk.txt"), "\n";

open(FH,">>src.txt") or die $!;
print FH "hello world!\n";
close(FH);

open(FH,"<lnk.txt") or die $!;
print "linked data: ", scalar(<FH>), "\n";
close(FH);

Мои результаты (запускается как "Администратор" - может не работать для "других пользователей" - Не знаю, почему, но мой cmd.exe всегда открывается с повышенными привилегиями):

src.txt exists? 1
lnk.txt exists?
Result:
lnk.txt exists? 1
linked data: hello world!

Список каталогов:

10/22/2011  02:53 PM    <DIR>          .
10/22/2011  02:53 PM    <DIR>          ..
10/22/2011  02:54 PM               636 foo.pl
10/22/2011  02:53 PM    <SYMLINK>      lnk.txt [src.txt]
10/22/2011  02:53 PM                14 src.txt

Я понятия не имею, какие [тонкие] различия могут быть, если таковые имеются, между символическими ссылками NTFS и символическими ссылками "UNIX". Кроме того, вышеприведенный не будет работать до Vista / 2008 - предыдущие версии NTFS не не поддерживают символические ссылки (а предыдущие версии Windows не имеют функции CreateSymbolicLink ).

1 голос
/ 24 октября 2011

Сделан обходной путь:

my $oldfilename = File::Spec->catfile($oldname);
my $newfilename = File::Spec->catfile($newname);
if(-f $newfilename){ } else {
    @args = ("mklink", $newfilename, $oldfilename);
    system(@args) == 0; } 
...