我很难搞清楚为什么在从tar文件中提取文件后无法打开文件。当我试图打开或读取我刚刚从tar中提取的文件的内容时,我会收到“拒绝访问”错误消息。当我终于弄清楚我做错了什么时,我正打算在StackOverflow上发布这个问题。以为我会在将来为需要它的人发布问题和答案。简单的解决方案就是使用除Perl Tar之外的东西,但是......
~~~问题~~~
您提取tar文件的内容。如果在尝试打开或读取刚刚从tar文件中提取的文件时收到拒绝访问的消息,则可能是因为在对文件/目录进行tarring时未保留权限。
~~~ SOLUTION ~~~
如下所述:
http://perldoc.perl.org/Archive/Tar.html#GLOBAL-VARIABLES
默认情况下,Archive :: Tar会尝试chmod你的文件(搞乱权限)。要防止这种情况,您需要将以下全局变量设置为“0”:
$ Archive :: Tar :: CHMOD = 0; #PRESERVE PERMISSIONS
~~~~~~~~~~~~~~~~
以下代码显示了如何在perl代码中使用全局变量(欢迎其他评论/建议/批评)......
#folder structure:
# /cygdrive/c/00_backup_base
# |
# |
# +---- base
# |
# |
# +----00_TEST
#!/usr/bin/perl
use strict;
use warnings 'all';
use Archive::Tar;
use File::Find;
use File::Copy;
my $ACID='/cygdrive/c/00_backup_base';
my $myTarFile='base_tar.gz';
my $testDir="00_TEST";
my $base='base';
# ----- ZIP DIRECTORY ----
my @inventory = (); #array, store list of director contents
chdir $ACID or die "chdir failed on $ACID\n";
find (sub { push @inventory, $File::Find::name }, "$base");
#_Create a new tar object
$Archive::Tar::CHMOD = 0; # PRESERVE PERMISSIONS!
my $tar = Archive::Tar->new();
$tar->add_files( @inventory );
# Write compressed tar file
print " Create Zip file \n";
$tar->write( "$myTarFile");
chdir "../..";
# ----- EXTRACT FILES -----
chdir $ACID;
copy("${archive}", "${testDir}/${archive}");
chdir ${testDir};
# Now extract:
$Archive::Tar::CHMOD = 0; # PRESERVE PERMISSIONS!
my $tar_b = Archive::Tar->new();
$tar_b->read( $myTarFile );
$tar_b->extract();
答案 0 :(得分:1)
在最初的帖子中回答
欢迎提出其他意见/建议/批评
~~~ SOLUTION ~~~
如果在尝试打开或读取刚刚从tar文件中提取的文件时收到拒绝访问的消息,可能是因为在对文件/目录进行tarring时未保留权限。
如下所述:
http://perldoc.perl.org/Archive/Tar.html#GLOBAL-VARIABLES
默认情况下,Archive :: Tar会尝试chmod你的文件(搞乱权限)。要防止这种情况,您需要将以下全局变量设置为“0”:
$ Archive :: Tar :: CHMOD = 0; #PRESERVE PERMISSIONS