Libzippp是Libzip庫周圍的簡單基本C ++包裝器。它本來是一個用於拉鍊處理的便攜式且易於使用的庫。
彙編已通過:
基礎圖書館:
有關可用壓縮方法的更多信息,請參見此處。
Libzippp已移植到VCPKG,因此可以通過運行非常容易集成:
./vcpkg install libzippp
該庫至少需要編譯C ++ 11。
Linux
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev )。make libraries來使用makefile。視窗:
所有操作系統
LIBZIPPP_ENABLE_ENCRYPTION在Libzippp中啟用它。mkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseAdd Cache Entry以添加CMAKE_BUILD_TYPE如果不使用MSVC構建)Configure和GenerateCMAKE_PREFIX_PATH設置為將其安裝到的目錄中(通過-DCMAKE_PREFIX_PATH=<...>或通過GUI)-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL目標要安裝。 通過Commandline設置為cmake -DNAME=VALUE <other opts>或通過CMAKE GUI或CCMAKE Add Cache Entry 。
LIBZIPPP_INSTALL :啟用/禁用libzippp的安裝。使用via add_subdirectory時默認值關閉LIBZIPPP_INSTALL_HEADERS :啟用/禁用libzippp標頭的安裝。使用via add_subdirectory時默認值關閉LIBZIPPP_BUILD_TESTS :啟用/禁用建築物libzippp測試。使用via add_subdirectory時默認值關閉LIBZIPPP_ENABLE_ENCRYPTION :啟用/禁用具有加密功能的libzippp。默認值關閉。LIBZIPPP_CMAKE_CONFIG_MODE :使用LIBZIP安裝的CMake Config文件啟用/禁用建築物。默認值關閉。LIBZIPPP_GNUINSTALLDIRS :使用從gnuinstalldirs獲取的安裝目錄啟用/禁用建築物。默認值關閉。CMAKE_INSTALL_PREFIX :在哪里安裝項目CMAKE_BUILD_TYPE :設置釋放或調試以構建有或沒有優化CMAKE_PREFIX_PATH :以此使用的安裝libs使用的前綴路徑(包含lib的路徑和include文件夾)的結腸分隔列表BUILD_SHARED_LIBS :設置為ON或OFF以構建共享或靜態LIB,如果未設置,則使用平台默認一旦安裝了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在makefile的LIBZIP_CMAKE變量中明確禁用。
請參閱此處以獲取更多信息。
最簡單的方法是下載Zlib,Libzip和Libzippp來源,並使用CMAKE GUI按順序構建每個庫:
Source ,在其中Build到新的文件夾buildGenerate但是還有一個準備好的批處理文件可以幫助自動化此文件。不過,它可能需要進行一些調整。
確保您有CMAKE 3.20( CMAKE.EXE必須在路徑中)和MS Visual Studio。
從版本中下載libzippp- <版本> -windows -ready_to_compile.zip文件,並在系統上的某個地方提取它。這將創建一個準備好的結構,因此可以與所需的庫一起編譯Libzippp 。
檢查是否在LIB中使用任何補丁。有時,根據版本,有些文件在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,否則您需要使用可執行文件包裝的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”。相反,只需在編譯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以及將使用它的代碼。為了避免此問題,您必須靜態地鏈接庫。
更多信息在這裡。
可以在這裡找到額外的解釋。
這個項目是在我的業餘時間完全開發的。
由於我是加密貨幣(尤其是Cardano(ADA))的忠實擁護者,因此您可以在下面的地址向我發送一些硬幣(請在此處檢查):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66