yunglean808 has asked for the wisdom of the Perl Monks concerning the following question:

Hello! I'm having an issue where I'm trying to extract files from a directory and I run into errors that permit the code from successfully executing. This does not happen all the time and I'm not sure if there is a perfect fix for this. I have provided part of my extract method where the issue lies. The common error I'm getting is: Making hard link from "addressA" to "addressB" failed at line xxx. If you could provide me with any insight with this issue it would be very appreciated. Thank you in advance!

my @members = $tar->list_files(); foreach my $f (@members) { my $fileName = $f; $fileName =~ s/.+\///; my $toUnzip = File::Spec->catpath("", $out_dir,$fileName); $tar->extract_file($f,$toUnzip) unless (-e $toUnzip); #fails on line above }

Replies are listed 'Best First'.
Re: Hard link issue
by GotToBTru (Prior) on Jul 07, 2016 at 16:00 UTC

    Perhaps test to see if $toUnzip already exists before you extract? Or if $out_dir does? I would expect a more explicit error message in either case, but I am not familiar with File::Spec.

    But God demonstrates His own love toward us, in that while we were yet sinners, Christ died for us. Romans 5:8 (NASB)

Re: Hard link issue
by oiskuu (Hermit) on Jul 13, 2016 at 18:12 UTC

    Try listing the tar archive with the hardlink. For example:

    $ tar -tvf test.tar
    drwxr-xr-x 0/0       0 2016-07-13 00:00 t/
    drwxr-xr-x 0/0       0 2016-07-13 00:00 t/foo/
    -rw-r--r-- 0/0       7 2016-07-13 00:00 t/foo/A
    drwxr-xr-x 0/0       0 2016-07-13 00:00 t/bar/
    hrw-r--r-- 0/0       0 2016-07-13 00:00 t/bar/B link to t/foo/A
    

    The equivalent of ln t/foo/A t/bar/B is performed when extracting such an archive. However, you have chosen to flatten the directory structure and extract all files in one target directory. In this case, linking will fail because the source file cannot be found in its expected location. (The t/foo/A is now outdir/A instead.)

    I would suggest performing the operation in two stages: first to extract the files as usual, then flattening the directory.