【发布时间】:2014-01-23 06:58:05
【问题描述】:
我很难弄清楚为什么从 tar 文件中提取文件后无法打开文件。当我试图打开或读取刚刚从 tar 中提取的文件的内容时,我会收到“拒绝访问”错误消息。当我终于弄清楚我做错了什么时,我正要在 StackOverflow 上发布这个问题。以为我会为将来需要它的任何人发布问题和答案。简单的解决方案只需要使用 Perl Tar 之外的东西,但是 ...
~~~问题~~~
您提取 tar 文件的内容。如果您在尝试打开或读取刚从 tar 文件中提取的文件时收到拒绝访问消息,这可能是因为在 tar 文件/目录时未保留权限。
~~~解决方案~~~
如中所述:
http://perldoc.perl.org/Archive/Tar.html#GLOBAL-VARIABLES
默认情况下,Archive::Tar 将尝试对您的文件进行 chmod(权限混乱)。为了防止这种情况,您需要将以下全局变量设置为“0”:
$Archive::Tar::CHMOD = 0; #保留权限
~~~~~~~~~~~~~~~~
以下代码展示了如何在 perl 代码中使用全局变量(欢迎补充 cmets/suggestions/critiques)...
#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();
【问题讨论】:
标签: perl permissions cygwin file-permissions tar