Libzippp é um invólucro básico de C ++ simples em torno da biblioteca Libzip. É para ser uma biblioteca portátil e fácil de usar para manuseio de zip.
A compilação foi testada com:
Bibliotecas subjacentes:
Para mais informações sobre os métodos de compactação disponíveis, consulte aqui.
Libzippp foi portado para o VCPKG e, portanto, pode ser facilmente integrado pela execução:
./vcpkg install libzippp
Esta biblioteca requer pelo menos C ++ 11 para ser compilada.
Linux
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev ).make libraries .Windows:
Todos os sistemas operacionais
LIBZIPPP_ENABLE_ENCRYPTION .mkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseAdd Cache Entry para adicionar CMAKE_BUILD_TYPE se não estiver construindo com msvcConfigure e GenerateCMAKE_PREFIX_PATH para os diretórios em que você os instalou (via -DCMAKE_PREFIX_PATH=<...> ou através da GUI)-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL para instalar. Defina via comando linha como cmake -DNAME=VALUE <other opts> ou via cmake gui ou ccmake Add Cache Entry .
LIBZIPPP_INSTALL : Ativar/desativar a instalação do libzippp. O padrão está desligado ao usar via add_subdirectory , elseLIBZIPPP_INSTALL_HEADERS : Ativar/desativar a instalação dos cabeçalhos libzippp. O padrão está desligado ao usar via add_subdirectory , elseLIBZIPPP_BUILD_TESTS : Ativar/desativar os testes Libzippp. O padrão está desligado ao usar via add_subdirectory , elseLIBZIPPP_ENABLE_ENCRYPTION : ativar/desativar a construção libzippp com recursos de criptografia. O padrão está desligado.LIBZIPPP_CMAKE_CONFIG_MODE : Enable/desabilite o edifício com arquivos de configuração CMake instalados Libzip. O padrão está desligado.LIBZIPPP_GNUINSTALLDIRS : Ativar/desativar a construção com diretórios de instalação retirados de Gnuinstalldirs. O padrão está desligado.CMAKE_INSTALL_PREFIX : onde instalar o projeto paraCMAKE_BUILD_TYPE : configurado para liberar ou depurar para construir com ou sem otimizaçõesCMAKE_PREFIX_PATH : lista separada por cólon de caminhos de prefixo (caminhos contendo lib e include pastas) para que os libs instalados sejam usados por issoBUILD_SHARED_LIBS : defina ou desligado para criar libs compartilhadas ou estáticas, usa a plataforma padrão se não for definido Depois de instalado, o libzippp pode ser usado em qualquer projeto CMake com facilidade:
Dado que ele foi instalado (via CMAKE_INSTALL_PREFIX ) em um local padrão ou seu prefixo de instalação é passado para seus projetos CMAKE_PREFIX_PATH você pode simplesmente chamar find_package(libzippp 3.0 REQUIRED) e link contra libzippp::libzippp .
Quando não estiver usando o CMake para consumir libzippp, você deve passar seu diretório de incluir para o seu compilador e link contra libzippp.{a,so} . Não se esqueça de também vincular as bibliotecas libzip, por exemplo, na lib/libzip-1.11.2/lib/.libs/ ). Um exemplo de compilação com G ++:
g++ -I./src
-I./lib/libzip-1.11.2/lib I./lib/libzip-1.11.2/build
main.cpp libzippp.a
lib/libzip-1.11.2/lib/.libs/libzip.a
lib/zlib-1.3.1/libz.a Desde a versão 1.5, o Libzip usa uma biblioteca criptográfica subjacente (OpenSSL, GNUTLS ou CommonCrypto) necessária para a compilação estática. Por padrão, o Libzippp usará -lssl -lcrypto (OpenSSL) como sinalizadores padrão para compilar os testes. Isso pode ser alterado usando make CRYPTO_FLAGS="-lsome_lib" LIBZIP_CMAKE="" tests .
Como o arquivo do Libzip cmake detecta automaticamente a biblioteca criptográfica a usar, por padrão todas as bibliotecas permitidas, mas o OpenSSL estão explicitamente desativadas na variável LIBZIP_CMAKE no makefile.
Veja aqui para obter mais informações.
A maneira mais fácil é baixar fontes Zlib, Libzip e Libzippp e usar a GUI do CMake para construir cada biblioteca em ordem:
Source para a pasta de origem das bibliotecas, Build para uma nova pasta build dentro delaGenerateMas há também um arquivo em lote preparado para ajudar a automatizar isso. Pode precisar de algum ajuste.
Certifique -se de ter CMake 3.20 ( cmake.exe deve estar no caminho) e MS Visual Studio.
Faça o download do arquivo Libzippp- <Versão> -Windows-ready_to_compile.zip da versão e extrai em algum lugar do seu sistema. Isso criará uma estrutura preparada, para que a libzippp possa ser compilada junto com as bibliotecas necessárias.
Verifique se há algum patch para aplicar na lib . Às vezes, alguns arquivos não são compiláveis em C89 no Libzip, dependendo da versão.
Simplesmente execute o arquivo compile.bat . Isso compilará Zlib , Libzip e, finalmente , Libzippp .
Você terá uma pasta distante que contém as pastas de liberação e depuração , onde agora pode executar os testes Libzippp.
Certifique -se de ter o CMake 3.10 ( cmake.exe deve estar no caminho) e o MS Visual Studio 2012.
Faça o download das fontes Libzip e Zlib e extrai -as na pasta 'lib'. Você deve acabar com a seguinte estrutura:
libzippp/compile.bat
libzippp/lib/zlib-1.3.1
libzippp/lib/libzip-1.11.2
Execute o compilador.bat (basta clicar duas vezes nele). A compilação deve ficar sem erro.
Você terá uma pasta distante que contém as pastas de liberação e depuração , onde agora pode executar os testes Libzippp.
Você pode usar libzipp.dll e libzipp.lib para vincular dinamicamente a biblioteca ou simplesmente usar libzippp_static.lib para vinculá -lo estaticamente. A menos que você também vincule o ZLIB e o Libzippp estaticamente, você precisará da DLL embalada com seu executável.
A API deve ser muito direta. Algumas explicações francesas podem ser encontradas aqui.
# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::ReadOnly);
vector<ZipEntry> entries = zf. getEntries ();
vector<ZipEntry>::iterator it;
for (it=entries. begin () ; it!=entries. end (); ++it) {
ZipEntry entry = *it;
string name = entry. getName ();
int size = entry. getSize ();
// the length of binaryData will be given by 'size'
void * binaryData = entry. readAsBinary ();
// the length of textData will be given by 'size'
string textData = entry. readAsText ();
// ...
}
zf. close ();
return 0 ;
}Você também pode criar um arquivo diretamente a partir de um buffer
# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
char * buffer = someData;
uint32_t bufferSize = sizeOfBuffer;
ZipArchive* zf = ZipArchive::fromBuffer (buffer, bufferSize);
if (zf!= nullptr ) {
/* work with the ZipArchive instance */
zf-> close ();
delete zf;
}
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::ReadOnly);
// raw access
char * data = ( char *)zf. readEntry ( " myFile.txt " , true );
ZipEntry entry1 = zf. getEntry ( " myFile.txt " );
string str1 (data, entry1. getSize ());
// text access
ZipEntry entry2 = zf. getEntry ( " myFile.txt " );
string str2 = entry2. readAsText ();
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::ReadOnly);
ZipEntry largeEntry = z1. getEntry ( " largeentry " );
std::ofstream ofUnzippedFile ( " largeFileContent.data " );
largeEntry. readContent (ofUnzippedFile);
ofUnzippedFile. close ();
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::Write);
# ifdef LIBZIPPP_USE_BZIP2
// Advanced usage : change the compression method. Default is DEFLATE.
zf. setCompressionMethod (entry, CompressionMethod::BZIP2);
# endif
zf. addEntry ( " folder/subdir/ " );
const char * textData = " Hello,World! " ;
zf. addData ( " helloworld.txt " , textData, 12 );
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::Write);
zf. deleteEntry ( " myFile.txt " );
zf. deleteEntry ( " myDir/subDir/ " );
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
class SimpleProgressListener : public ZipProgressListener {
public:
SimpleProgressListener ( void ) {}
virtual ~SimpleProgressListener ( void ) {}
void progression ( double p) {
cout << " -- Progression: " << p << endl;
}
};
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
/* add/modify/delete entries in the archive */
// register the listener
SimpleProgressListener spl;
zf. addProgressListener (&spl);
// adjust how often the listener will be invoked
zf. setProgressPrecision ( 0.1 );
// listener will be invoked
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
// important to use calloc/malloc for the fromWritableBuffer !
void * buffer = calloc ( 4096 , sizeof ( char ));
ZipArchive* z1 = ZipArchive::fromWritableBuffer (&buffer, 4096 , ZipArchive::New);
/* add content to the archive */
// updates the content of the buffer
z1-> close ();
// length of the buffer content
int bufferContentLength = z1-> getBufferLength ();
ZipArchive::free (z1);
// read again from the archive:
ZipArchive* z2 = ZipArchive::fromBuffer (buffer, bufferContentLength);
/* read the archive - no modification allowed */
ZipArchive::free (z2);
// read again from the archive, for modification:
ZipArchive* z3 = ZipArchive::fromWritableBuffer (&buffer, bufferContentLength);
/* read/write the archive */
ZipArchive::free (z3);
free (buffer);
return 0 ;
} Por padrão, o manuseio de erros é bastante básico e os detalhes de erros são despejados no stderr . No entanto, é possível fornecer um método de retorno de chamada para substituir esse comportamento. Se for necessário algum contexto, você poderá usar std::bind ou lambda functions.
# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. setErrorHandlerCallback ([]( const std::string& message,
const std::string& strerror ,
int zip_error_code,
int system_error_code)
{
// Handle error here
fprintf (stderr, message. c_str (), strerror . c_str ());
});
zf. open (ZipArchive::Write);
zf. addEntry ( " folder/subdir/ " );
const char * textData = " Hello,World! " ;
zf. addData ( " helloworld.txt " , textData, 12 );
zf. close ();
return 0 ;
}Você já deve ter libzip compilado em outras partes do seu sistema. Portanto, você não precisa correr 'Make Libzip'. Em vez disso, basta colocar o local da libzip quando você compila Libzippp:
make LIBZIP=path/to/libzip Sob o Debian, você terá que instalar o pacote zlib1g-dev para compilar se não quiser instalar o ZLIB manualmente.
Por padrão, o Visual Studio 2012 está instalado no caminho a seguir:
C:Program Files (x86)Microsoft Visual Studio 11.0
Esteja ciente de que classes não virtuais são compartilhadas na DLL do Libzippp. Portanto, você precisará usar o mesmo compilador para libzippp e as partes do código que o usarão. Para evitar esse problema, você terá que vincular a biblioteca estaticamente.
Mais informações aqui.
Explicações extras podem ser encontradas aqui.
Este projeto está completamente desenvolvido durante meu tempo livre.
Como sou um grande fã de criptomoedas e, especialmente, Cardano (ADA), você pode me enviar algumas moedas no endereço abaixo (verifique aqui):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66