2012-02-17 48 views
0

我想遞歸掃描一堆zip文件,當然,我正在使用archive :: zip。我想避免將存檔的內容擴展到臨時文件夾中。我想能夠使用類似(近僞代碼):zip文件中的遞歸下降?

sub CALLMYSELFAGAIN ..... 

my @members = $currentZipFile->members(); 
while(my $member = pop @members){      
    if ($member->isTextFile()){ 
     push @content, $member->contents(); 
    }elsif(isZipFile($member->fileName())){ 
     CALLMYSELFAGAIN($member); 
    } 

的問題是,$member->can("memberNames"))返回false,所以$member不是一個存檔::拉鍊的,我不能打開它的意義再次作爲一個zip文件。或者我錯了?

任何提示?

+0

你是否有目錄和zip文件或zip文件?看來你混淆了兩者。 – Ouki 2012-02-17 15:31:29

+2

如果你確實有一個zip文件,你想要遞歸遍歷,請注意,惡意zip文件是可能的 - 你可以創建一個壓縮文件解壓縮到一個精確的副本本身,無限遞歸(zip quine); http://research.swtch.com/zip – Daenyth 2012-02-17 17:42:29

回答

0

你可以這樣做:

elsif (isZipFile($member->filename)) { 
    my $contents = $currentZipFile->contents($member); 
    open my $fh, '<', \$contents; # In-memory filehandle 
    my $child_zip = Archive::Zip->new; 
    $child_zip->readFromFileHandle($fh); 
    CALLMYSELFAGAIN($child_zip); 
} 

,但期望這是非常內存密集型,尤其是如果你去一個以上的級別深度。

+1

我收到與文件不可查找的錯誤有關的錯誤:錯誤:文件不可查找 at D:/Perl64/lib/Archive/Zip/Archive.pm line 576 (''Archive :: Zip :: Archive = HASH(0x 2c63180)','GLOB(0x2a5dc38)')at _________.pm line 190 012elmetellib :: zipdecent(' filename.zip') – Daniel 2012-02-17 16:06:55

+0

無論如何,你的答案幫助我確定一個解決方案。謝謝 – Daniel 2012-02-18 11:41:58