Fitur yang Didukung • Memulai • Unduh • Persyaratan • Membangun & Menggunakan • Donasi • Lisensi
Bit7Z adalah perpustakaan statis C ++ cross-platform yang memungkinkan kompresi/ekstraksi file arsip melalui antarmuka pembungkus yang bersih dan sederhana ke perpustakaan dinamis dari proyek 7-zip.
Ini mendukung kompresi dan ekstraksi ke dan dari sistem file atau memori, membaca metadata arsip membaca, memperbarui yang sudah ada, membuat arsip multi-volume, panggilan balik kemajuan operasi, dan banyak fungsi lainnya.
Kehadiran atau tidak dari beberapa fitur di atas tergantung pada perpustakaan bersama tertentu yang digunakan bersama dengan Bit7Z.
Misalnya, 7z.dll harus mendukung semua fitur ini, 7ZA.DLL harus berfungsi hanya dengan format file 7Z, dan 7ZXA.DLL hanya dapat mengekstrak file 7Z. Untuk informasi lebih lanjut tentang DLL 7-ZIP, silakan periksa halaman wiki ini.
Pada akhirnya, beberapa fitur lain (misalnya, deteksi format otomatis dan ekstraksi selektif menggunakan ekspresi reguler ) dinonaktifkan secara default, dan definisi makro harus digunakan selama kompilasi agar tersedia (Wiki).
Di bawah ini adalah beberapa contoh yang menunjukkan cara menggunakan beberapa fitur utama Bit7Z.
# include < bit7z/bitfileextractor.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7za.dll " };
BitFileExtractor extractor{ lib, BitFormat::SevenZip };
// Extracting a simple archive
extractor. extract ( " path/to/archive.7z " , " out/dir/ " );
// Extracting a specific file inside an archive
extractor. extractMatching ( " path/to/archive.7z " , " file.pdf " , " out/dir/ " );
// Extracting the first file of an archive to a buffer
std::vector< byte_t > buffer;
extractor. extract ( " path/to/archive.7z " , buffer );
// Extracting an encrypted archive
extractor. setPassword ( " password " );
extractor. extract ( " path/to/another/archive.7z " , " out/dir/ " );
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }Atau, jika Anda hanya perlu mengerjakan satu arsip:
# include < bit7z/bitarchivereader.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7z.dll " };
// Opening the archive
BitArchiveReader archive{ lib, " path/to/archive.gz " , BitFormat::GZip };
// Testing the archive
archive. test ();
// Extracting the archive
archive. extractTo ( " out/dir/ " );
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }# include < bit7z/bitfilecompressor.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7z.dll " };
BitFileCompressor compressor{ lib, BitFormat::Zip };
std::vector< std::string > files = { " path/to/file1.jpg " , " path/to/file2.pdf " };
// Creating a simple zip archive
compressor. compress ( files, " output_archive.zip " );
// Creating a zip archive with a custom directory structure
std::map< std::string, std::string > files_map = {
{ " path/to/file1.jpg " , " alias/path/file1.jpg " },
{ " path/to/file2.pdf " , " alias/path/file2.pdf " }
};
compressor. compress ( files_map, " output_archive2.zip " );
// Compressing a directory
compressor. compressDirectory ( " dir/path/ " , " dir_archive.zip " );
// Creating an encrypted zip archive of two files
compressor. setPassword ( " password " );
compressor. compressFiles ( files, " protected_archive.zip " );
// Updating an existing zip archive
compressor. setUpdateMode ( UpdateMode::Append );
compressor. compressFiles ( files, " existing_archive.zip " );
// Compressing a single file into a buffer
std::vector< bit7z:: byte_t > buffer;
BitFileCompressor compressor2{ lib, BitFormat::BZip2 };
compressor2. compressFile ( files[ 0 ], buffer );
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }Atau, jika Anda hanya perlu mengerjakan satu arsip:
# include < bit7z/bitarchivewriter.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7z.dll " };
BitArchiveWriter archive{ lib, BitFormat::SevenZip };
// Adding the items to be compressed (no compression is performed here)
archive. addFile ( " path/to/file.txt " );
archive. addDirectory ( " path/to/dir/ " );
// Compressing the added items to the output archive
archive. compressTo ( " output.7z " );
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }# include < bit7z/bitarchivereader.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7za.dll " };
BitArchiveReader arc{ lib, " archive.7z " , BitFormat::SevenZip };
// Printing archive metadata
std::cout << " Archive properties n " ;
std::cout << " Items count: " << arc. itemsCount () << ' n ' ;
std::cout << " Folders count: " << arc. foldersCount () << ' n ' ;
std::cout << " Files count: " << arc. filesCount () << ' n ' ;
std::cout << " Size: " << arc. size () << ' n ' ;
std::cout << " Packed size: " << arc. packSize () << " nn " ;
// Printing the metadata of the archived items
std::cout << " Archived items " ;
for ( const auto & item : arc ) {
std::cout << ' n ' ;
std::cout << " Item index: " << item. index () << ' n ' ;
std::cout << " Name: " << item. name () << ' n ' ;
std::cout << " Extension: " << item. extension () << ' n ' ;
std::cout << " Path: " << item. path () << ' n ' ;
std::cout << " IsDir: " << item. isDir () << ' n ' ;
std::cout << " Size: " << item. size () << ' n ' ;
std::cout << " Packed size: " << item. packSize () << ' n ' ;
std::cout << " CRC: " << std::hex << item. crc () << std::dec << ' n ' ;
}
std::cout. flush ();
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }Referensi API lengkap tersedia di bagian wiki.
Bit7Z V4 terbaru memperkenalkan beberapa perubahan besar pada API perpustakaan.
std::string (bukan std::wstring ), sehingga pengguna dapat menggunakan perpustakaan dalam proyek lintas platform lebih mudah (V4 memperkenalkan dukungan Linux/MacOS juga).std::string S akan dianggap sebagai UTF-8 yang dikodekan.-DBIT7Z_USE_NATIVE_STRING .BitExtractor lama sekarang disebut BitFileExtractor .BitExtractor hanyalah nama kelas templat untuk semua kelas ekstraksi.BitCompressor lama sekarang disebut BitFileCompressor .BitCompressor hanyalah nama kelas templat untuk semua kelas kompresi.ProgressCallback sekarang harus mengembalikan nilai bool yang menunjukkan apakah operasi saat ini dapat berlanjut ( true ) atau tidak ( false ).include/ ke folder include/bit7z/ , jadi #include directive sekarang perlu menyiapkan bit7z/ ke nama header yang disertakan (misalnya, #include <bit7z/bitfileextractor.hpp> ).lib/<architecture>/ ; Jika generator cmake multi-konfigasi (misalnya, visual studio generator), folder output default adalah lib/<architecture>/<build type>/ .BIT7Z_VS_LIBNAME_OUTDIR_STYLE .Setiap paket yang dirilis berisi:
Paket tersedia untuk arsitektur X86 dan X64 .
Anda juga dapat mengkloning/mengunduh repositori ini dan membangun perpustakaan sendiri (tolong, baca wiki).
.dll di Windows, 7-zip/p7zip .so perpustakaan di UNIX 3 . Untuk membangun perpustakaan:
cd < bit7z folder >
mkdir build && cd build
cmake ../ -DCMAKE_BUILD_TYPE=Release
cmake --build . -j --config ReleasePanduan yang lebih rinci tentang cara membangun perpustakaan ini tersedia di sini.
Anda juga dapat secara langsung mengintegrasikan perpustakaan ke dalam proyek Anda melalui CMake:
third_party ), atau tambahkan sebagai submodule git dari repositori Anda.add_subdirectory() di CMakeLists.txt Anda untuk memasukkan bit7z.bit7z menggunakan perintah target_link_libraries() .Misalnya:
add_subdirectory ( ${CMAKE_SOURCE_DIR} /third_party/bit7z )
target_link_libraries ( ${YOUR_TARGET} PRIVATE bit7z )Perpustakaan sangat dapat disesuaikan: untuk daftar terperinci dari opsi build yang tersedia, silakan merujuk ke wiki.
Saat mengkonfigurasi Bit7Z melalui CMake, secara otomatis mengunduh versi terbaru 7-ZIP yang didukung oleh perpustakaan.
Secara opsional, Anda dapat menentukan versi 7 -ZIP yang berbeda melalui opsi CMake BIT7Z_7ZIP_VERSION (misalnya, -DBIT7Z_7ZIP_VERSION="22.01" ).
Atau, Anda dapat menentukan jalur khusus yang berisi kode sumber 7-zip melalui opsi BIT7Z_CUSTOM_7ZIP_PATH .
Harap dicatat bahwa, secara umum, yang terbaik adalah menggunakan versi 7-zip yang sama dari perpustakaan bersama yang akan Anda gunakan saat runtime.
Secara default, Bit7Z kompatibel dengan 7z.so dari 7-zip v23.01 dan yang lebih baru.
Jika Anda berencana untuk menggunakan 7z.so dari P7ZIP atau 7-ZIP V22.01 dan sebelumnya, Anda memiliki dua cara untuk membuat BIT7Z kompatibel:
-DBIT7Z_USE_LEGACY_IUNKNOWN=ON ; atau-DBIT7Z_7ZIP_VERSION="22.01" ).Pada Linux dan MacOS , 7-ZIP V23.01 memperkenalkan perubahan besar pada antarmuka IUnknown. Akibatnya, jika Anda membangun Bit7Z untuk versi 7-ZIP (default) seperti itu, itu tidak akan mendukung menggunakan pustaka bersama dari versi 7-zip sebelumnya (atau dari P7ZIP). Sebaliknya, Bit7Z dibuat untuk versi 7-ZIP sebelumnya atau untuk P7ZIP tidak sesuai dengan perpustakaan bersama dari 7-ZIP v23.01 dan yang lebih baru.
Anda dapat membangun pustaka bersama 7-zip v23.01 dalam mode yang kompatibel dengan mundur dengan mendefinisikan makro Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN . Jika ini adalah kasus Anda, Anda harus mengaktifkan BIT7Z_USE_LEGACY_IUNKNOWN untuk membuat Bit7Z berfungsi (dalam hal ini, Bit7Z akan kompatibel juga dengan versi sebelumnya 7-ZIP/P7ZIP).
Secara default, Bit7Z mengikuti manifesto UTF-8 Everywhere untuk menyederhanakan penggunaan perpustakaan dalam proyek lintas platform. Singkatnya, ini berarti bahwa:
std::string .std::string S dianggap sebagai UTF-8 yang dikodekan; output std::string s adalah UTF-8 yang dikodekan. Pada sistem POSIX, std::string S biasanya sudah dikodekan UTF-8, dan tidak diperlukan konfigurasi.
Situasi ini sedikit lebih kompleks pada Windows karena, secara default, Windows memperlakukan std::string S sebagaimana dikodekan menggunakan halaman kode sistem, yang mungkin tidak selalu menjadi UTF-8, seperti, misalnya, Windows-1252.
Jika program Anda berurusan secara eksklusif dengan string ASCII saja, Anda harus baik-baik saja dengan pengaturan BIT7Z default (karena karakter ASCII juga UTF-8).
Namun, jika Anda perlu menangani karakter non-ASCII/UNICODE, seperti yang mungkin, Anda memiliki opsi berikut:
Menegakkan menggunakan halaman kode UTF-8 untuk seluruh aplikasi Anda, seperti yang dijelaskan oleh Microsoft di sini:
Secara manual memastikan pengkodean std::string S diteruskan ke Bit7Z:
ReadConsoleW ), dan ubah menjadi UTF-8 (Bit7Z menyediakan fungsi utilitas untuk ini, bit7z::to_tstring ).SetConsoleOutputCP(CP_UTF8) sebelumnya. Mengkonfigurasi Bit7Z untuk menggunakan string lebar UTF-16 yang dikodekan (yaitu, std::wstring ) dengan mengaktifkan opsi BIT7Z_USE_NATIVE_STRING melalui cmake.
Jika program Anda hanya Windows, atau Anda sudah menggunakan string lebar pada Windows, ini mungkin pilihan terbaik karena akan menghindari konversi string internal (7-zip selalu menggunakan string lebar).
Opsi ini membuat pengembangan aplikasi lintas platform sedikit tidak nyaman karena Anda masih harus menggunakan std::string pada sistem POSIX.
Perpustakaan menyediakan tipe alias bit7z::tstring dan fungsi makro BIT7Z_STRING untuk mendefinisikan variabel string lebar dan literal pada jendela dan yang sempit di platform lain.
Anda harus secara terprogram mengatur input standar dan output encoding ke UTF-16 untuk membaca dan mencetak karakter Unicode dengan benar:
# include < fcntl.h > // for _O_U16TEXT
# include < io.h > // for _setmode
_setmode (_fileno(stdout), _O_U16TEXT); // setting the stdout encoding to UTF16
_setmode (_fileno(stdin), _O_U16TEXT); // setting the stdin encoding to UTF16 Mengkonfigurasi Bit7Z untuk menggunakan pengkodean halaman kode sistem untuk std::string dengan mengaktifkan opsi BIT7Z_USE_SYSTEM_CODEPAGE melalui cmake.
Jika Anda menemukan proyek ini bermanfaat, silakan pertimbangkan untuk mendukung saya dengan sumbangan kecil sehingga saya dapat terus memperbaikinya! Terima kasih!
Proyek ini dilisensikan berdasarkan ketentuan Lisensi Publik Mozilla v2.0.
Untuk detail lebih lanjut, silakan periksa:
Versi yang lebih lama (v3.x dan sebelumnya) dari Bit7Z dirilis di bawah Lisensi Publik Umum GNU V2.
Di Windows, Anda juga harus menautkan program Anda dengan OLEAUT32 (misalnya -lbit7z -loleaut32 ).
Di Linux dan MacOS, Anda harus menautkan program Anda juga dengan DL (misalnya -lbit7z -ldl ).
Jika Anda menggunakan perpustakaan melalui CMake, dependensi ini akan ditautkan secara otomatis ke proyek Anda. ↩
MSVC 2010 didukung hingga v2.x, MSVC 2012/2013 hingga v3.x. ↩
Bit7Z tidak mengirim dengan perpustakaan bersama 7-zip. Anda dapat membangunnya dari kode sumber yang tersedia di 7-zip.org. ↩