Рекурсивный спуск в zip-файлах?

Я пытаюсь рекурсивно сканировать кучу zip-файлов и использую, конечно, archive::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")) возвращает ложь, так $member НЕ является архивом:: zip в том смысле, что я не смог открыть его снова как файл zip. Или я не прав?

Любой намек?

1 ответ

Решение

Вы можете сделать это:

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);
}

но ожидайте, что это будет очень интенсивно использовать память, особенно если вы углубляетесь более чем на один уровень.

Другие вопросы по тегам