2010-04-12 66 views
1

我正在读取一个包含一些归档文件的目录并逐个解压缩归档文件。将tar文件归档到Perl中的其他位置

一切似乎都很好,但是文件在具有运行子模块的主Perl代码模块的文件夹中得到解压缩。

我想要在我指定的文件夹中生成档案。

这是我的代码:

sub ExtractFile 
{ 

#Read the folder which was copied in the output path recursively and extract if any file is compressed 
my $dirpath = $_[0]; 

opendir(D, "$dirpath") || die "Can't open dir $dirpath: $!\n"; 
my @list = readdir(D); 
closedir(D); 


foreach my $f (@list) 
{ 
    print " \$f = $f"; 
    if(-f $dirpath."/$f") 
    { 
    #print " File in directory $dirpath \n ";#is \$f = $f\n"; 

    my($file_name, $file_dirname,$filetype)= fileparse($f,qr{\..*}); 

    #print " \nThe file extension is $filetype"; 
    #print " \nThe file name is is $file_name"; 


    # If compressed file then extract the file 
    if($filetype eq ".tar" or $filetype eq ".tzr.gz") 
    { 

    my $arch_file = $dirpath."/$f"; 
    print "\n file to be extracted is $arch_file"; 
    my $tar = Archive::Tar->new($arch_file); 
    #$tar->extract() or die ("Cannot extract file $arch_file"); 

    #mkdir($dirpath."/$file_name"); 
    $tar->extract_file($arch_file,$dirpath."/$file_name") or die ("Cannot extract file $arch_file"); 
    } 

    } 
    if(-d $dirpath."/$f") 
    { 
    if($f eq "." or $f eq "..") 
    { next; } 
    print " Directory\n";# is $f"; 
    ExtractFile($dirpath."/$f"); 
    } 

} 


} 

方法ExtractFile被称为递归循环的所有档案。 使用$tar->extract()时,它将在调用此方法的文件夹中解压缩。

当我使用$tar->extract_file($arch_file,$dirpath."/$file_name")我得到一个错误:

在档案没有这样的文件: '/home/fsang/dante/workspace/output/s.tar' 通过/ home/fsang /但丁/ lib目录/Extraction.pm line 80

请帮助我检查了路径和输入输出没有问题。我不知道$tar->extract_file()

非常感谢任何人解决此问题。

问候, Sakshi

回答

0

一个错字?

$tar->extract_file($arch_file,$dirpath."/$file_name") 

大概应该是

$tar->extract_file($arch_file,$dirpath."/".$file_name) 
+0

不,你是一个错字。你的“固定”行有奇数的引号。 – cjm 2010-04-12 06:54:47

+0

它仍然给出相同的错误信息 – 2010-04-12 06:56:23

+0

谢谢@cjm - 我忘了行尾的报价 - 编辑 – Axarydax 2010-04-12 06:57:20

2

你误解extract_file。第一个参数是存档中要提取的文件的名称。您正在传递档案本身的路径。你通过了new;你不需要再次通过它。如错误信息所示,s.tar不包含名为/home/fsang/dante/workspace/output/s.tar的文件,因此extract_file失败。

您可以使用$tar->list_files获取存档中的文件列表。

一个更简单的解决方案可能是临时chdir到您想要提取存档的目录。 File::pushd提供了一个简单的方法来做到这一点。

+0

您能解释一下在第一个参数中传递什么 我也通过了归档文件iestar的名称,但它仍然说 归档中没有这样的文件:包含名为/ home/fsang/dante/workspace/output的文件/s.tar 看来,这是在寻找一些收集的文件,我需要将其添加在一些集合属性调用extract_file方法 感谢您的帮助 – 2010-04-12 07:03:45

+0

嗨 由于之前..现在我更好地理解和使用File :: pushd发现解决方案 非常感谢 – 2010-04-12 08:31:14

0
$tarFile = "test.tar.gz"; 
$myTar = Archive::Tar->new($tarFile); 
foreach my $member ($myTar->list_files()) 
{ 
    my $res = $myTar->extract_file($member , 'C:/temp/'.$member); 
    print "Exract error!\n" unless ($res); 
} 
0

我看到一把枪被带到瑞士军刀斗争。 这里有一个* nix中的一行,你想要做什么:

find /source/dir -name "*.tar" -exec tar -C /target/dir -xvzf '{}' \; -print 

是否需要写一个脚本此? 除了调试行之外,您不一定在做任何特殊的事情。