Libzippp는 Libzip 라이브러리 주변의 간단한 기본 C ++ 래퍼입니다. 지퍼 처리를위한 휴대용 및 사용하기 쉬운 라이브러리가되어야합니다.
컴파일은 다음과 같이 테스트되었습니다.
기본 라이브러리 :
사용 가능한 압축 방법에 대한 자세한 내용은 여기를 참조하십시오.
libzippp는 vcpkg로 포팅되었으므로 실행을 통해 매우 쉽게 통합 될 수 있습니다.
./vcpkg install libzippp
이 라이브러리는 최소한 C ++ 11을 컴파일해야합니다.
리눅스
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev )의 개발 패키지를 설치하십시오.make libraries 실행하여 Makefile을 사용할 수 있습니다.Windows :
모든 운영 체제
LIBZIPPP_ENABLE_ENCRYPTION 통해 libzippp에서 활성화해야합니다.mkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseCMAKE_BUILD_TYPE MSVC로 빌드하지 않은 경우 Add Cache Entry 클릭하십시오.Configure 및 Generate 클릭하십시오CMAKE_PREFIX_PATH 설치 한 디렉토리로 설정해야합니다 ( -DCMAKE_PREFIX_PATH=<...> 또는 GUI를 통해).-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL 대상을 구축하십시오. cmake -DNAME=VALUE <other opts> 또는 cmake gui 또는 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 : libzip 설치된 cmake 구성 파일로 빌드를 활성화/비활성화합니다. 기본값이 꺼져 있습니다.LIBZIPPP_GNUINSTALLDIRS : gnuinstalldirs에서 가져온 설치 디렉토리를 사용하여 빌드를 활성화/비활성화합니다. 기본값이 꺼져 있습니다.CMAKE_INSTALL_PREFIX : 프로젝트를 설치할 위치CMAKE_BUILD_TYPE : 최적화 유무에 관계없이 빌드 또는 디버그로 설정CMAKE_PREFIX_PATH : 콜론-분리 된 접두사 경로 목록 ( lib 포함 경로 및 폴더 include )은 설치된 Libs를 사용하여 사용합니다.BUILD_SHARED_LIBS : 공유 또는 정적 libs 빌드를 위해 켜기 또는 끄기로 설정, 설정되지 않은 경우 플랫폼 기본값을 사용합니다. 일단 설치되면 모든 CMAKE 프로젝트에서 LibzIPPP를 쉽게 사용할 수 있습니다.
CMAKE_INSTALL_PREFIX 를 통해 표준 위치에 설치되거나 설치 접두사가 프로젝트에 전달되어 CMAKE_PREFIX_PATH 를 전달하면 find_package(libzippp 3.0 REQUIRED) 호출하고 libzippp::libzippp 에 대해 링크 할 수 있습니다.
cmake를 사용하여 libzippp를 소비하지 않으면 포함 된 디렉토리를 컴파일러로 전달하고 libzippp.{a,so} 에 연결해야합니다. lib/libzip-1.11.2/lib/.libs/ )의 libzip 라이브러리와 연결하는 것을 잊지 마십시오. 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 의 파일은 기본적으로 모든 허용 라이브러리가 makefile의 LIBZIP_CMAKE 변수에서 설명 할 수있는 모든 라이브러리가 기본적으로 사용하도록 자동으로 암호화 라이브러리를 감지하므로 OpenSSL은 설명합니다.
자세한 내용은 여기를 참조하십시오.
가장 쉬운 방법은 zlib, libzip 및 libzippp 소스를 다운로드하고 cmake gui를 사용하여 각 라이브러리를 순서대로 구축하는 것입니다.
Source 소스 소스 폴더, 내부의 새 폴더 build BuildGenerate그러나이를 자동화하는 데 도움이되는 준비된 배치 파일도 있습니다. 그래도 조정이 필요할 수 있습니다.
CMAKE 3.20 ( cmake.exe 가 경로에 있어야 함)과 MS Visual Studio가 있는지 확인하십시오.
릴리스에서 libzippp- <bersion> -windows-ready_to_compile.zip 파일을 다운로드하여 시스템 어딘가에서 추출하십시오. 이로 인해 준비된 구조가 생성되므로 LibzIPPP는 필요한 라이브러리와 함께 컴파일 할 수 있습니다.
lib 에 적용 할 패치가 있는지 확인하십시오. 때로는 일부 파일이 버전에 따라 Libzip의 C89에서 컴파일 할 수 없습니다.
compile.bat 파일을 실행하기 만하면됩니다. 이것은 zlib , libzip 및 마지막으로 libzippp를 컴파일합니다.
LibzIPPP 테스트를 실행할 수있는 릴리스 및 디버그 폴더가 포함 된 DEIS 폴더가 있습니다.
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를 실행하십시오 (간단히 두 번 클릭하십시오). 컴파일은 오류없이 가야합니다.
LibzIPPP 테스트를 실행할 수있는 릴리스 및 디버그 폴더가 포함 된 DEIS 폴더가 있습니다.
libzippp.dll 및 libzippp.lib를 사용하여 라이브러리를 동적으로 연결하거나 libzippp_static.lib를 사용하여 정적으로 연결할 수 있습니다. Zlib 및 Libzippp를 통계적으로 연결하지 않으면 실행 파일로 패키지 된 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-finctions를 사용할 수 있습니다.
# 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 만들기'를 실행할 필요가 없습니다. 대신 libzippp를 컴파일 할 때 libzip 위치를 넣으십시오.
make LIBZIP=path/to/libzip Debian에서는 Zlib를 수동으로 설치하지 않으려면 컴파일하려면 zlib1g-dev 패키지를 설치해야합니다.
기본적으로 MS Visual Studio 2012는 다음 경로에 설치됩니다.
C:Program Files (x86)Microsoft Visual Studio 11.0
비 사건 전용 클래스는 libzippp의 DLL 내에서 공유됩니다. 따라서 libzippp에 동일한 컴파일러와 사용할 코드를 사용해야합니다. 이 문제를 피하려면 라이브러리를 정적으로 연결해야합니다.
자세한 내용은 여기에 있습니다.
추가 설명은 여기에서 찾을 수 있습니다.
이 프로젝트는 여가 시간에 완전히 개발되었습니다.
나는 cryptocurrencies, 특히 Cardano (ADA)의 열렬한 팬이므로 아래 주소에서 동전을 보내주십시오 (여기에서 확인하십시오).
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66