Рекурсивный спуск в 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);
}
но ожидайте, что это будет очень интенсивно использовать память, особенно если вы углубляетесь более чем на один уровень.