Perl |档案::焦油|文件提取后访问被拒绝|保留权限

时间:2014-01-05 23:04:12

标签: perl permissions cygwin file-permissions tar

我很难搞清楚为什么在从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();     

1 个答案:

答案 0 :(得分:1)

在最初的帖子中回答

欢迎提出其他意见/建议/批评

~~~ SOLUTION ~~~

如果在尝试打开或读取刚刚从tar文件中提取的文件时收到拒绝访问的消息,可能是因为在对文件/目录进行tarring时未保留权限。

如下所述:

http://perldoc.perl.org/Archive/Tar.html#GLOBAL-VARIABLES

默认情况下,Archive :: Tar会尝试chmod你的文件(搞乱权限)。要防止这种情况,您需要将以下全局变量设置为“0”:

$ Archive :: Tar :: CHMOD = 0; #PRESERVE PERMISSIONS