2010-04-12 67 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 

是否需要寫一個腳本此? 除了調試行之外,您不一定在做任何特殊的事情。