sexta-feira, 4 de dezembro de 2009

Pesquisar em ZIPs sem abri-los!

Há pouco tempo fui incumbido de encontrar dentre uma centena de arquivos zips, aqueles que tinham um pequeno defeito. Os zips continham muitos arquivos pequenos e um xml que descrevia o conteúdo; o defeito estava nesse xml.

Parecia uma tarefa perfeita para um script em Perl. Achei então o módulo Archive::Zip, que tornou a tarefa muito mais simples do que eu antecipara.

O código abaixo percorre todos os arquivos de uma pasta, abre cada um deles e analisa o xml.

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
my $dirname='/tmp/zips';

opendir(DIR, $dirname) or die "Can't open dir\n";
while (defined($file = readdir(DIR))) {

#evita tentar abrir "." e ".."
if(length($file)>2) {
my $zip=Archive::Zip->new();

#abre zip
$zip->read("$dirname/$file");

#lê arquivo
my $data=$zip->contents("index.xml");

#processar arquivo aqui
}
}
O conteúdo inteiro de cada arquivo vai para a variável $data e com ela podemos analisar o xml para decidir o que fazer, como se faz com um string qualquer.

Um comentário: