Libzippp - это простая базовая обертка C ++ вокруг библиотеки Libzip. Он предназначен для портативной и простой в использовании библиотеки для обработки молнии.
Компиляция была протестирована с:
Основные библиотеки:
Для получения дополнительной информации о доступных методах сжатия см. Здесь.
Libzippp был перенесен в VCPKG и, следовательно, может быть очень легко интегрирован с помощью работы:
./vcpkg install libzippp
Эта библиотека требует, по крайней мере, C ++ 11 для составления.
Linux
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev ).make libraries .Windows:
Все операционные системы
LIBZIPPP_ENABLE_ENCRYPTION .mkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseAdd Cache Entry , чтобы добавить CMAKE_BUILD_TYPE , если не построить с MSVCConfigure и GenerateCMAKE_PREFIX_PATH в каталоги, в которых вы установили их в (либо через -DCMAKE_PREFIX_PATH=<...> или через графический интерфейс)-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL для установки. Установите через командную линию как cmake -DNAME=VALUE <other opts> или через графический интерфейс cmake или CCMake Add Cache Entry .
LIBZIPPP_INSTALL : включить/отключить установку Libzippp. По умолчанию выключено при использовании через add_subdirectory , иначе наLIBZIPPP_INSTALL_HEADERS : включить/отключить установку заголовков Libzippp. По умолчанию выключено при использовании через add_subdirectory , иначе наLIBZIPPP_BUILD_TESTS : включить/отключить строительные тесты Libzippp. По умолчанию выключено при использовании через add_subdirectory , иначе наLIBZIPPP_ENABLE_ENCRYPTION : включить/отключить здание Libzippp с возможностями шифрования. По умолчанию выключено.LIBZIPPP_CMAKE_CONFIG_MODE : включить/отключить здание с установленными файлами конфигурации Cmake. По умолчанию выключено.LIBZIPPP_GNUINSTALLDIRS : включить/отключить здание с каталогами установки, взятых из Gnuinstalldirs. По умолчанию выключено.CMAKE_INSTALL_PREFIX : где установить проект наCMAKE_BUILD_TYPE : установить для выпуска или отладки для создания с оптимизацией или без негоCMAKE_PREFIX_PATH : Список профиксов, разделенных толстой кишкой (пути, содержащие lib и include папки) для установленных либеров, которые будут использоваться этимBUILD_SHARED_LIBS : установить или выключить для строительства общих или статических либеров, использует платформу по умолчанию, если не установлена После установки Libzippp можно легко использовать в любом проекте Cmake:
Учитывая, что он был установлен (через CMAKE_INSTALL_PREFIX ) в стандартное местоположение, или его префикс установки передается в ваши проекты CMAKE_PREFIX_PATH вы можете просто позвонить find_package(libzippp 3.0 REQUIRED) и ссылку против libzippp::libzippp .
Когда вы не используете Cmake для употребления Libzippp, вы должны передать его каталог своему компилятору и ссылки против libzippp.{a,so} . Не забудьте также связаться с библиотеками Libzip, например, в Lib/libzip-1.11.2/lib/.libs/ ). Пример компиляции с 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 С момента версии 1.5 Libzip использует базовую криптографическую библиотеку (OpenSSL, GNUTLS или CommonCrypto), которая необходима для статической компиляции. По умолчанию Libzippp будет использовать -lssl -lcrypto (openssl) в качестве флага по умолчанию для составления тестов. Это можно изменить с помощью make CRYPTO_FLAGS="-lsome_lib" LIBZIP_CMAKE="" tests .
Поскольку файл Libzip cmake автоматически обнаруживает для использования криптографической библиотеки, по умолчанию все разрешенные библиотеки, но OpenSSL явно отключены в переменной LIBZIP_CMAKE в Makefile.
Смотрите здесь для получения дополнительной информации.
Самый простой способ - скачать источники Zlib, Libzip и Libzippp и использовать Gui Cmake для создания каждой библиотеки в порядке:
Source в папку источника библиотек, Build в новую build папки внутри нееGenerateНо есть также подготовленный пакетный файл, чтобы помочь автоматизировать это. Это может понадобиться некоторая корректировка, хотя.
Убедитесь, что у вас есть Cmake 3.20 ( Cmake.exe должен быть на пути) и MS Visual Studio.
Загрузите файл libzippp- <sersion> -windows-ry_to_compile.zip из выпуска и извлеките его где-нибудь в вашей системе. Это создаст подготовленную структуру, поэтому Libzippp может быть составлен вместе с необходимыми библиотеками.
Проверьте, есть ли патч для применения в LIB . Иногда некоторые файлы не подлежат компиляции в C89 в Libzip, в зависимости от версии.
Просто выполните файл compile.bat . Это составит Zlib , Libzip и, наконец, Libzippp .
У вас будет папка Dist , содержащая папки выпуска и отладки , где вы теперь можете выполнить тесты Libzippp.
Убедитесь, что у вас есть Cmake 3.10 ( Cmake.exe должен быть на пути) и MS Visual Studio 2012.
Загрузите источники Libzip и Zlib и извлеките их в папку «LIB». Вы должны получить следующую структуру:
libzippp/compile.bat
libzippp/lib/zlib-1.3.1
libzippp/lib/libzip-1.11.2
Выполните compile.bat (просто дважды щелкните по нему). Компиляция должна обойтись без ошибки.
У вас будет папка Dist , содержащая папки выпуска и отладки , где вы теперь можете выполнить тесты Libzippp.
Вы можете использовать libzippp.dll и libzippp.lib , чтобы динамически связать библиотеку или просто использовать libzippp_static.lib , чтобы связать ее статически. Если вы также не связываете Zlib и Libzippp Stataly, вам понадобится DLL, упакованный с вашим исполняемым файлом.
API предназначен для того, чтобы быть очень простым. Некоторые французские объяснения можно найти здесь.
# 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 ;
}Вы также можете создать архив непосредственно из буфера
# 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 ;
} По умолчанию обработка ошибок довольно базовая, а детали ошибок сбрасываются в stderr . Тем не менее, можно предоставить метод обратного вызова, чтобы переопределить это поведение. Если требуется какой-то контекст, вы можете использовать std::bind или Lambda-функции.
# 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 ;
}Вы, возможно, уже собрали Libzip в другом месте в вашей системе. Следовательно, вам не нужно запустить «сделать Libzip». Вместо этого просто поместите местоположение Libzip, когда вы компилируете Libzippp:
make LIBZIP=path/to/libzip В рамках Debian вам придется установить пакет zlib1g-dev , чтобы компилировать, если вы не хотите устанавливать Zlib вручную.
По умолчанию MS Visual Studio 2012 установлен под следующим путем:
C:Program Files (x86)Microsoft Visual Studio 11.0
Имейте в виду, что классы, не являющиеся виртуальными, используются в DLL Libzippp. Следовательно, вам нужно будет использовать тот же компилятор для Libzippp и части кода, которые будут его использовать. Чтобы избежать этой проблемы, вам придется связать библиотеку статически.
Больше информации здесь.
Дополнительные объяснения можно найти здесь.
Этот проект полностью разработан в свободное время.
Поскольку я большой поклонник криптовалют и особенно Cardano (ADA), вы можете отправить мне несколько монет по адресу ниже (проверьте это здесь):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66