Eu tenho um arquivo zip que contém muitos arquivos zip. Quero verificar o conteúdo de um zip interno sem extraí-lo para o sistema de arquivos.
Se eu iterar sobre o conteúdo do arquivo zip externo, Zip::File.foreach
recebo um Zip::Entry
que representa o arquivo zip cujo conteúdo desejo inspecionar. Não consigo descobrir como fazer isso sem extrair o sub-zip para o sistema de arquivos.
POSSO chamar .extract("some_destination.zip")
o sub-bzip e tratá-lo como um zip normal de nível superior). Isso funciona, mas estou apenas tentando verificar o conteúdo em um teste de unidade e não quero escrever coisas desnecessariamente no sistema de arquivos.
Nota lateral: antes que alguém pergunte "por que" eu tenho sub-zips ou aponte a falta de valor de compactação para fazer isso... É porque a Apple quer que você crie um zip de zips para adicionar vários tickets a uma carteira da Apple ao mesmo tempo.
Uma maneira fácil de fazer isso é ler na memória o conteúdo da entrada zip externa e, em seguida
Zip
, instanciar uma nova instância usando aZip::File.open_buffer
API.No exemplo a seguir, assumimos, para simplificar, um arquivo zip externo, que inclui um arquivo zip interno, que inclui um arquivo de texto simples:
provavelmente é possível usar fluxos para realizar as mesmas tarefas, mas é mais fácil cometer erros (ou seja, ler acidentalmente várias vezes durante a depuração) e, se o arquivo for pequeno o suficiente (e, claro, não há risco de ataque), ler na memória é aceitável.