This module is reported to be broken in current versions of activestate perl: http://code.activestate.com/ppm/Win32-Symlink/
http://matrix.cpantesters.org/?dist=Win32-Symlink+0.04
Am using activestate Perl version 5.12.3.1204 and windows 7 32bit with NTFS.
How to shell out to mklink?
| [reply] [d/l] [select] |
my $oldfilename = File::Spec->catfile($oldname);
my $newfilename = File::Spec->catfile($newname);
if(-f $newfilename){ } else {
@args = ("mklink", $newfilename, $oldfilename);
system(@args) == 0; }
| [reply] [d/l] |
I tried with active perl version 5.8.8 and the Win32::Symlink module got installed. But it created only directory junction despite passing a file.
To (hard) link a file on Windows, you don't need a module, just use the built-in Perl link function. For example:
link $oldfile, $newfile or die "link failed: $!";
You should only use Win32::Symlink for directories, not files.
That's because Windows junctions are for directories only; see Hard Links and Junctions and Creating Symbolic Links
and Symbolic Links for details.
As for the Win32::Symlink 0.04 PPM failures you mentioned, I just tried building it from source and it failed to compile due to an incompatibility with struct REPARSE_DATA_BUFFER between Win32::Symlink and the Microsoft header files, so I just raised a ticket #71879. BTW, I was able to get it to build simply by hacking
tclreadlink.c, changing REPARSE_DATA_BUFFER to MY_REPARSE_DATA_BUFFER.
| [reply] [d/l] |