Pergunta

Eu estou trabalhando em um projeto usando C ++, Boost, e Qt. Eu entendo como compactar arquivos individuais e bytestreams usando, por exemplo, a função, a qCompress () em Qt.

Como faço para compactar um diretório de vários arquivos, incluindo subdiretórios? Estou à procura de um cross-platform (Mac, Win, Linux) solução; Eu prefiro não para disparar um monte de novos processos.

Existe uma maneira padrão para combinar bytestreams de vários arquivos em um arquivo zipado, ou talvez há uma função de conveniência ou método que estaria disponível na biblioteca impulso iostream?

Muito obrigado pela ajuda.

Atualização : O QuaZip olhares biblioteca realmente grande. Há um exemplo no pacote de download (no dir "testes"), que mostra muito claramente como fechar acima de um diretório de arquivos.

Update 2 : Depois de completar esta tarefa no meu ambiente de compilação Linux, eu descobri que QuaZip não funciona em todos com o compilador Visual Studio. Pode ser possível para resolver todos os erros do compilador, mas uma palavra de cautela para quem procura por este caminho.

Foi útil?

Solução

Eu encontrei as duas bibliotecas seguintes:

  • ZipIOS ++ . Parece ser C "puro" ++. Eles não lista o Windows explicitamente como uma plataforma suportada. Então eu acho que você deve tentar a sua sorte mesmo.
  • QuaZIP . Baseado em Qt4. Na verdade parece bom. Eles lista do Windows explicitamente (usando mingw). Aparentemente, ele é um wrapper C ++ para [este] biblioteca.

Ah, e claro, eu tenho rasgado esses sites de este questão Qt Mailinglist sobre Zipping / Unzipping de diretórios:)

Outras dicas

Apenas para o registro ...

Hoje, eu precisava fazer algo muito semelhante no Visual C ++. (Embora queria manter a possibilidade de compilar o projeto em outras plataformas;. No entanto preferiu não adotar Qt apenas para esta finalidade)

acabou usando o Minizip biblioteca. Ele é escrito em C puro, mas a elaboração de um simples C ++ invólucro em torno dele foi uma brisa, eo resultado final funciona muito bem, pelo menos para os meus propósitos.

Eu tentei QuaZIP 0.4.3 no Windows com VisualStudio 2010 - ainda existem problemas, mas pode ser resolvido facilmente

.

Para construir com VS:

  1. Use CMake para configurar e gerar solução VS para QuaZIP.
  2. Soltion aberto com VS e construção - você vai primeiro aviso de que ele não pode encontrar 'zlib.h'
  3. .
  4. Abra as preferências para o projeto quazip e adicionar caminho para a cópia do Qt de Zlib para C / C ++ -> Geral-> adicionais incluir diretórios:. $ (QTDIR) / src / 3rdparty / zlib
  5. Reconstruir de novo e você vai obter lotes de avisos e um erro C2491:. Questão estática dllimport no QuaZipFile :: staticMetaObject
  6. Isto porque QuaZipFile é declarado como "classe QUAZIP_EXPORT QuaZipFile" e necessidades QUAZIP_EXPORT para resolver a Q_DECL_EXPORT para dll e Q_DECL_IMPORT para aplicação, com base em se QUAZIP_BUILD é definido ou não. Ao construir QuaZIP QUAZIP_BUILD devem ser definidos, mas não é -. Define processo de configuração em erro completamente inúteis "quazip_EXPORTS" em vez
  7. Para corrigir, basta remover "quazip_EXPORTS" de todas as configurações de compilação e adicionar QUAZIP_BUILD vez -. QuaZIP vai agora construir fina

Eu construí um invólucro em torno minizip adicionando algumas características que eu precisava e torná-lo mais agradável para usá-lo. É não usar a última c ++ 11 e é desenvolvido usando o Visual Studio 2013, assim que deve funcionar out-of-the-box para você.

Há uma descrição completa aqui: https://github.com/sebastiandev/zipper

Você pode fechar pastas inteiras, riachos, vetores, etc. Também um bom recurso está fazendo tudo totalmente na memória.

system("zip myarchive.zip *");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top